2016-05-26 2 views
1

J'ai une question simple et naïve, j'ai trouvé comment faire fonctionner mon script mais j'aimerais savoir pourquoi cela n'a pas fonctionné auparavant.Affectation d'une variable (avec joker) avec des parenthèses par rapport à aucune

j'assigne une variable avec un joker en utilisant une syntaxe similaire à:

var=$dir/$subj/name*text*text.nii.gz

je pourrais appeler le nom de fichier approprié avec ls $ file, mais quand j'ai essayé de remplacer dans le fichier $ comme entrée en une ligne de commande (en utilisant FSL pour le traitement d'image), j'ai eu une erreur disant qu'il ne pouvait pas trouver le fichier avec des caractères génériques en place.

Cependant, quand j'assigne la variable avec des parenthèses:

var=($dir/$subj/name*text*text.nii.gz)

Il fonctionne très bien. Je suppose qu'il existe d'autres et probablement meilleurs moyens de le faire, mais je me demande simplement pourquoi l'affectation initiale des variables n'a pas fonctionné, et quelle est la meilleure façon d'assigner des variables de cette manière.

Merci!

Répondre

4

Considérons un répertoire avec trois fichiers:

$ ls 
file1 file2 file3 

définissent maintenant une variable:

$ var=file* 

Nous pouvons voir ce qui est en var en utilisant declare -p:

$ declare -p var 
declare -- var="file*" 

Comme vous pouvez voir, var a toujours la * dedans. Cela est dû au fait que extension de chemin d'accès n'est pas effectuée pour les affectations de variables. Par conséquent, var ne fonctionnera pas toujours comme vous l'auriez souhaité. Par exemple:

$ ls "$var" 
ls: cannot access file*: No such file or directory 

Ensuite, nous allons essayer de créer un tableau:

$ var=(file*) 
$ declare -p var 
declare -a var='([0]="file1" [1]="file2" [2]="file3")' 

Comme vous pouvez le voir, expansion du chemin est effectuée sur des tableaux. Par conséquent, ce qui suit fonctionne:

$ ls "$var" 
file1 

Mais, notez que, pour un tableau, $var se réfère uniquement au premier élément. Si vous souhaitez accéder à toutes ses entrées, une notation plus complexe est nécessaire:

$ ls "${var[@]}" 
file1 file2 file3