Question Quand avons-nous besoin d'accolades autour des variables shell?


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 est-ce juste du style? Est-ce que l'un est préféré à l'autre?


453
2018-01-05 19:54


origine


Réponses:


Dans cet exemple particulier, cela ne fait aucune différence. Cependant, le {} dans ${} sont utiles si vous voulez étendre la variable foo dans la chaîne

"${foo}bar"

depuis "$foobar" serait plutôt développer foobar.

Les accolades sont également requises sans condition lorsque:

  • éléments de tableau en expansion, comme dans ${array[42]}
  • en utilisant des opérations d’extension de paramètres, comme dans ${filename%.*} (enlever l'extension)
  • élargissement des paramètres de position au-delà de 9: "$8 $9 ${10} ${11}"

Faire cela partout, plutôt que dans des cas potentiellement ambigus, peut être considéré comme une bonne pratique de programmation. C'est à la fois pour la cohérence et pour éviter les surprises comme $foo_$bar.jpg, où il n'est pas visuellement évident que le trait de soulignement devient une partie du nom de la variable.


528
2018-01-05 20:05



Les variables sont déclarées et attribuées sans $ Et sans {}. Vous devez utiliser

var=10

assigner. Afin de lire à partir de la variable (en d'autres termes, 'développer' la variable), vous devez utiliser $.

$var      # use the variable
${var}    # same as above
${var}bar # expand var, and append "bar" too
$varbar   # same as ${varbar}, i.e expand a variable called varbar, if it exists.

Cela m'a parfois rendu confus - dans d'autres langues, nous faisons référence à la variable de la même manière, qu'elle soit à gauche ou à droite d'une affectation. Mais le shell-scripting est différent, $var=10 ne fait pas ce que vous pourriez penser


104
2018-01-05 21:41



Tu utilises {} pour le groupement. Les accolades sont nécessaires pour déréférencer les éléments du tableau. Exemple:

dir=(*)           # store the contents of the directory into an array
echo "${dir[0]}"  # get the first entry.
echo "$dir[0]"    # incorrect

29
2018-02-14 08:30



Vous êtes également capable de manipuler du texte dans les accolades:

STRING="./folder/subfolder/file.txt"
echo ${STRING} ${STRING%/*/*}

Résultat:

./folder/subfolder/file.txt ./folder

ou

STRING="This is a string"
echo ${STRING// /_}

Résultat:

This_is_a_string

Vous avez raison dans "les variables régulières" ne sont pas nécessaires ... Mais il est plus utile pour le débogage et pour lire un script.


22
2018-04-26 02:18



La fin du nom de la variable est généralement indiquée par un espace ou une nouvelle ligne. Mais que faire si nous ne voulons pas d'espace ou de nouvelle ligne après l'impression de la valeur de la variable? Les accolades indiquent à l'interpréteur de shell où se trouve la fin du nom de la variable.

Classic Exemple 1) - Variable de shell sans espaces blancs

TIME=10

# WRONG: no such variable called 'TIMEsecs'
echo "Time taken = $TIMEsecs"

# What we want is $TIME followed by "secs" with no whitespace between the two.
echo "Time taken = ${TIME}secs"

Exemple 2)

# WRONG
CLASSPATH=hibernate-$LATESTVERSION_src.zip:hibernate_$LATEST_VERSION.jar

(La réponse de Fred le dit déjà mais son exemple est un peu trop abstrait)


8
2018-01-17 11:03



Après la suggestion de SierraX et de Peter concernant la manipulation de texte, les accolades {} 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 roman italien connu sous le nom de weel:

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

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

Maintenant, créez 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 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é.


0