Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 28/03/2022, à 09:49

3sylvano31415

variable en bash

Bonjour, premier message sur ce forum!

Alors, je suis débutant en bash et j'ai un problème dont je n'arrive pas à comprendre l'origine malgré la lecture de plein de pages sur les variables bash etc.
or il me bloque depuis un moment déjà. Voici mon script (executable):


for i in 1 2 3 4 5 6 7 ; do
j="$i"
path_run${j}_out="/home/scratch01/lgcalix/IGCM_OUT/OL2/TEST/test/RUN${j}"
path_run${j}="/home/scratch01/lgcalix/TESTOFFLINE/modipsl/config/ORCHIDEE_OL/RUN${j}"
done

Je lui demande juste de générer des strings (pour avoir des raccourcis de path) et il me sort toujours 'n'est pas un nom de fichier ou de dossier' - et ça je le sais pcq lesdits dossiers
ne sont pas encore créés - Mais je ne lui demande rien vis à vis de la string, donc je ne comprends pas qu'il réponde cela - je ne lui envoie pas un cd path_run
et quand dans le terminal je demande d' echo les path_run leur valeur est vide.

Merci d'avance

Hors ligne

#2 Le 28/03/2022, à 11:01

Watael

Re : variable en bash

Bonjour,

Comme demandé dans le premier message du tutoriel Retour utilisable de commande

Pour ajouter toi-même les balises code à ton précédent message #1 :

  • Cliquer sur  le lien « Modifier » en bas à droite du message

  • Sélectionner le texte

  • Cliquer sur le <> de l'éditeur de message

https://pix.cyber-nux.fr/upload/img/1642675956.jpg

Voir règles du forum > balises BB code

Balise CODE :

C'est la balise à utiliser pour donner de longs messages d'erreurs, des contenus de fichiers de configuration, des commandes à taper, etc … Elle permet des messages plus "compacts", et est moins ambiguë que d'autres polices sur certains caractères.


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#3 Le 28/03/2022, à 11:05

Watael

Re : variable en bash

salut,

numéroter des variables de cette manière est une fausse bonne idée.
utilise plutôt un tableau :

path_run_out=( /home/scratch01/lgcalix/IGCM_OUT/OL2/TEST/test/RUN{1..7} )
path_run=( /home/scratch01/lgcalix/TESTOFFLINE/modipsl/config/ORCHIDEE_OL/RUN{1..7} )

tu retrouveras test/RUN1 avec "${path_run_out[1]}"


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#4 Le 28/03/2022, à 13:39

erresse

Re : variable en bash

Salut Watael,
Indépendamment du choix de travailler avec des tableaux qui est probablement plus indiqué dans son cas, pourrais-tu expliquer le pourquoi de ce fonctionnement de bash ?
Par curiosité, j'ai essayé aussi les instructions de notre ami et je ne comprends pas pourquoi on obtient cette réaction :

bash: path_run1_out=/home/scratch01/lgcalix/IGCM_OUT/OL2/TEST/test/RUN1: Aucun fichier ou dossier de ce type
bash: path_run1=/home/scratch01/lgcalix/TESTOFFLINE/modipsl/config/ORCHIDEE_OL/RUN1: Aucun fichier ou dossier de ce type

alors qu'on ne cherche qu'à créer le contenu d'une variable et non à exploiter l'URL... Pourquoi est-elle testée et sanctionnée ?
NB: si on tente d'exécuter le même instruction en utilisant la valeur 1 à la place de la variable $j, aucune erreur n'est remontée...


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois le problème solutionné, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#5 Le 28/03/2022, à 14:36

MicP

Re : variable en bash

Bonjour
Je tombe sur ce fil alors que je viens de poster sur un autre forum une solution
pour créer les variables :

#!/bin/bash

min=1
max=7

prefixRunOut="/home/scratch01/lgcalix/IGCM_OUT/OL2/TEST/test/RUN"
prefixRun="/home/scratch01/lgcalix/TESTOFFLINE/modipsl/config/ORCHIDEE_OL/RUN"

for ((i=min; i<=max; i++)); do
    declare 'path_run'"${i}"'_out='"$prefixRunOut${i}"
    declare 'path_run'"${i}"'='"$prefixRun${i}"
done

Hors ligne

#6 Le 28/03/2022, à 14:37

Watael

Re : variable en bash

j'imagine que le Remplacement de paramètres inhibe l'assignation...
bash chercherait donc un fichier nommé « nomVar${n}=/chemin/fichier », alors qu'il n'existe pas de dossier nomVar${n}=/, et pas de sous-dossiers sous lesquels trouver fichier.


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#7 Le 28/03/2022, à 14:40

Watael

Re : variable en bash

MicP a écrit :

Bonjour
Je tombe sur ce fil alors que je viens de poster sur un autre forum une solution
pour créer les variables :

#!/bin/bash

min=1
max=7

prefixRunOut="/home/scratch01/lgcalix/IGCM_OUT/OL2/TEST/test/RUN"
prefixRun="/home/scratch01/lgcalix/TESTOFFLINE/modipsl/config/ORCHIDEE_OL/RUN"

for ((i=min; i<=max; i++)); do
    declare 'path_run'"${i}"'_out='"$prefixRunOut${i}"
    declare 'path_run'"${i}"'='"$prefixRun${i}"
done

et pour automatiser l'utilisation de ces variables numérotées (faire la boucle inverse) ?

tu vois où je veux en venir ?

                |
                V

Dernière modification par Watael (Le 28/03/2022, à 19:46)


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#8 Le 28/03/2022, à 19:46

Tawal

Re : variable en bash

Hello,

La solution de MicP me paraît alléchante et correcte (sans parler du fonctionnel)
Mais, comme le souligne Watael, il faut une autre boucle pour l'accès à ces variables.
Du coup, la solution de Watael qui passe par un tableau est plus appropriée, amha.
Une manipulation de tableau et quand même plus simple qu'une manipulation de nom de variable, il me semble.

Dernière modification par Tawal (Le 28/03/2022, à 19:47)


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#9 Le 28/03/2022, à 19:59

Watael

Re : variable en bash

il ne faut pas absolument une boucle : chaque variable pourrait être utilisée avec des commandes différentes.
mais si c'est une même commande pour toutes, il y aura obligatoirement boucle.
Et là... hmm

Dernière modification par Watael (Le 28/03/2022, à 20:00)


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#10 Le 28/03/2022, à 22:07

MicP

Re : variable en bash

Oui, j'aime beaucoup plus l'utilisation de tableaux, plutôt que de créer des variables comme ça,
et j'avais d'ailleurs proposé les mêmes lignes de commandes que celles de Watael sur l'autre forum.

=======
Il faudrait que 3sylvano31415 nous dise comment vont être utilisées les variables créées,
car ça permettra peut-être de proposer une solution plus adaptée au problème à résoudre.

Dernière modification par MicP (Le 28/03/2022, à 22:12)

Hors ligne

#11 Le 29/03/2022, à 11:38

erresse

Re : variable en bash

3sylvano31415 a écrit :

Je lui demande juste de générer des strings (pour avoir des raccourcis de path)

Dans son message#1, il nous disait ceci. Donc, ces raccourcis pourraient être utilisés indépendamment les uns des autres, ou traités en série dans une boucle...


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois le problème solutionné, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#12 Le 29/03/2022, à 11:44

Watael

Re : variable en bash

erresse a écrit :
3sylvano31415 a écrit :

Je lui demande juste de générer des strings (pour avoir des raccourcis de path)

Dans son message#1, il nous disait ceci. Donc, ces raccourcis pourraient être utilisés indépendamment les uns des autres, ou traités en série dans une boucle...

c'est ce que j'ai dit, de manière peut-être un peu confuse.


Connected \o/
Welcome to sHell. · eval is evil.

En ligne