765 votes

Quand faut-il mettre des accolades autour des variables de l'interpréteur de commandes ?

Dans les scripts shell, quand utilisons-nous {} lors de l'expansion des variables ?

Par exemple, j'ai vu ce qui suit :

var=10        # Declare variable

echo "${var}" # One use of the variable
echo "$var"   # Another use of the variable

Y a-t-il une différence significative, ou s'agit-il simplement d'un style ? L'un est-il préféré à l'autre ?

12voto

codeforester Points 17582

Les accolades sont toujours nécessaires pour accéder aux éléments du tableau et effectuer l'expansion des accolades.

Il est bon de ne pas être trop prudent et d'utiliser {} pour l'expansion des variables de l'interpréteur de commandes, même lorsqu'il n'y a pas de place pour l'ambiguïté.

Par exemple :

dir=log
prog=foo
path=/var/${dir}/${prog}      # excessive use of {}, not needed since / can't be a part of a shell variable name
logfile=${path}/${prog}.log   # same as above, . can't be a part of a shell variable name
path_copy=${path}             # {} is totally unnecessary
archive=${logfile}_arch       # {} is needed since _ can be a part of shell variable name

Il est donc préférable d'écrire les trois lignes comme suit :

path=/var/$dir/$prog
logfile=$path/$prog.log
path_copy=$path

qui est définitivement plus lisible.

Puisque le nom d'une variable ne peut pas commencer par un chiffre, le shell n'a pas besoin de {} autour des variables numérotées (comme $1 , $2 etc.), sauf si cette expansion est suivie d'un chiffre. C'est trop subtil et cela oblige à utiliser explicitement {} dans de tels contextes :

set app      # set $1 to app
fruit=$1le   # sets fruit to apple, but confusing
fruit=${1}le # sets fruit to apple, makes the intention clear

Voir :

4voto

Fabio Natalini Points 51

Suite à la suggestion de SierraX et de Peter concernant la manipulation du texte, les crochets curly {} sont utilisés pour passer une variable à une commande, par exemple :

Disons que vous avez un sposi.txt fichier contenant la première ligne d'un célèbre roman italien :

> sposi="somewhere/myfolder/sposi.txt"
> cat $sposi

Ouput : quel ramo del lago di como che volge a mezzogiorno

Créez maintenant deux variables :

# Search the 2nd word found in the file that "sposi" variable points to
> word=$(cat $sposi | cut -d " " -f 2)

# This variable will replace the word
> new_word="filone"

Maintenant, remplacez le mot contenu de la variable avec celui de nouveau_mot dans le fichier sposi.txt

> sed -i "s/${word}/${new_word}/g" $sposi
> cat $sposi

Ouput : quel filone del lago di como che volge a mezzogiorno

Le mot "ramo" a été remplacé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X