Quand avons-nous besoin des accolades autour des variables shell?
Dans les scripts shell, quand doit-on utiliser {}
lors de l'expansion des variables?
Par exemple, j'ai vu les éléments suivants:
var=10 # Declare variable
echo "${var}" # One use of the variable
echo "$var" # Another use of the variable
Est là une différence importante, ou est-ce juste le style? Est un privilégié par rapport à l'autre?
Vous devez vous connecter pour publier un commentaire.
Dans cet exemple particulier, il ne fait aucune différence. Cependant, la
{}
dans${}
sont utiles si vous souhaitez augmenter la variablefoo
dans la chaînedepuis
"$foobar"
serait plutôt de développer la variable identifiée parfoobar
.Accolades sont inconditionnellement nécessaire lorsque:
${array[42]}
${filename%.*}
(suppression de l'extension)"$8 $9 ${10} ${11}"
Faire cela partout, au lieu de juste dans des situations ambiguës, peut être considéré comme une bonne pratique. C'est à la fois pour des raisons de cohérence et pour éviter les mauvaises 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.{}
est connu comme attelle d'extension.${}
est connu comme l'expansion des variables. Ils font des choses différentes. J'avais upvote vous, sauf pour le n ° d'extension bits.$()
?md5sum=$(md5sum foo.bin)
va stocker le résultat demd5sum foo.bin
dans la variablemd5sum
, maintenant accessible à l'aide de${md5sum}
. Aussi, +1 et beaucoup plus dans l'esprit de l'OP pour mentionner que c'est une bonne pratique pour être explicite!$()
exécute sa commande à partir d'un shell interne est exécuté.seq ${1:-20}
qui est le même queseq 1 20
. Quelle est la différence? (même dans l'exécution de la méthode?)$1
, qui si n'est pas défini sera remplacé par une valeur par défaut20
(la syntaxe est${variable:-default_value}
).${MY_VAR}
.Les Variables sont déclarées et attribué sans
$
et sans{}
. Vous devez utiliserà attribuer. Pour lire à partir de la variable (en d'autres termes, 'étendre' la variable), vous devez utiliser
$
.A ce qui me confond, parfois dans d'autres langues, nous nous référons à la variable de la même manière, indépendamment du fait que c'est à gauche ou à droite d'une affectation. Mais shell-script est différent,
$var=10
ne fait pas ce qu'on pourrait penser il ne!Vous utilisez
{}
pour le regroupement. Les accolades sont nécessaires pour déréférencer les éléments du tableau. Exemple:dir=(*)
. Autant que je sache,dir
est une commande pour lister le contenu d'un répertoire (équivalent àls -C -b
). Pourriez-vous expliquer?dir
est le nom de la variable, et les parenthèses sont utilisées pour recueillir le nom du fichier d'extension*
dans un tableau.Vous êtes également en mesure de faire une manipulation de texte entre accolades:
Résultat:
ou
Résultat:
Vous êtes droit dans "régulière variables" ne sont pas nécessaires... Mais il est plus utile pour le débogage et de lire un script.
La fin du nom de la variable est généralement identifié par un espace ou un saut de ligne. Mais que faire si nous ne voulons pas d'un espace ou un saut de ligne après l'impression de la valeur de la variable? Les accolades dire le shell interprète si la fin du nom de la variable est.
Exemple classique 1) - variable d'environnement sans fuite espaces
Exemple 2) chemin de classe Java avec versionnées pots
(Fred réponse déjà membres de ce mais son exemple est un peu trop abstrait)
Suivantes SierraX et Pierre suggestion au sujet de manipulation de texte, des 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 célèbre roman italien:
De sortie:
quel ramo del lago di como che volge a mezzogiorno
Maintenant créer deux variables:
Maintenant remplacer le mot à contenu variable avec l'un des new_word, à l'intérieur de sposi.txt fichier
De sortie:
quel filone del lago di como che volge a mezzogiorno
Le mot "rameau" a été remplacé.
weel-known novel
peu. Upvoted néanmoins.Accolades sont toujours nécessaires pour accéder aux éléments du tableau et de la réalisation d'orthèse d'extension.
Il est bon de ne pas être trop prudente et l'utilisation
{}
pour la variable shell extension, même quand il n'y a pas de place à l'ambiguïté.Par exemple:
Donc, il est préférable d'écrire trois lignes comme:
qui est certainement plus lisible.
Depuis un nom de variable ne peut pas commencer par un chiffre, shell n'a pas besoin de
{}
autour de numérotée variables (comme$1
,$2
etc.) à moins qu'une telle expansion est suivie par un chiffre. C'est trop subtil et il n'est à utiliser de manière explicite{}
dans de tels contextes:Voir: