$ echo $(date)
Thu Jul 2 16:33:11 SGT 2015
$ echo ${date}
$ name=foo
$ echo $(name)
ksh: name: not found
$ echo ${name}
foo
Il semble que $ {variable} soit identique à $ variable. tandis que $ () consiste à exécuter une commande. Pourquoi utiliser $ {} alors?
${
variable_name
}
Réponses:
$(command)
est la «substitution de commande». Comme vous semblez le comprendre, il exécute lecommand
, capture sa sortie et l'insère dans la ligne de commande qui contient le$(…)
; par exemple,${parameter}
est la «substitution de paramètres». De nombreuses informations peuvent être trouvées dans la page de manuel du shell, bash (1) , sous la rubrique « Expansion des paramètres »:Pour les paramètres de position, voir « Paramètres de position » ci-dessous. Dans son utilisation la plus courante, comme indiqué dans les autres réponses,
parameter
est un nom de variable. Le${…}
formulaire, comme indiqué à la fin du paragraphe ci-dessus, vous permet d'obtenir la valeur d'une variable (c'est-à-dire ) et de la suivre immédiatement avec une lettre, un chiffre ou un trait de soulignement:$variable_name
Vous pouvez également le faire avec des guillemets:
Ou, comme exercice d'options, vous pouvez utiliser une deuxième variable:
Mais ce n'est que l'étape 1. Le paragraphe suivant de la page de manuel est intéressant, bien qu'un peu cryptique:
Je ne sais pas comment je peux clarifier cela, sauf par exemple:
Appelons donc cette étape 1½. Il y a beaucoup de choses intéressantes que vous pouvez faire à l'étape 2:
Vous ne pouvez rien faire sans les
{
…}
accolades.Paramètres positionnels
Considérez cet exemple artificiel :
parce que la coquille ne comprend pas
$10
,$11
etc. Il traite$10
comme si elle était${1}0
. Mais il comprend${10}
,${11}
etc., comme mentionné dans la page de manuel ("un paramètre positionnel à plus d'un chiffre").Ce qui précède (ainsi que de nombreuses autres formes de constructions) sont discutés plus longuement dans la page de manuel du shell, bash (1) .
${parameter…something_else}
Une note sur les citations
Notez que vous devez toujours citer les variables du shell, sauf si vous avez une bonne raison de ne pas le faire, et vous êtes sûr de savoir ce que vous faites. En revanche, si les accolades peuvent être importantes, elles ne sont pas aussi importantes que les guillemets.
Cela s'applique également aux paramètres de position (c'est-à-dire aux arguments de ligne de commande, par exemple
"$1"
) et à la substitution de commande:Voir Bash quotes unescaped on command substitution pour un bref traité sur l'interaction entre les guillemets et
$(
…)
.la source
!
.${!animal}
fait référence à la variable$cat
au lieu de la valeur cat." Oui, c'est exactement le point. "Comment / at devient-il un" c "dans l'écho $ {animal / at / ow}?" Huh? / at ne devient pas "c"; «Chat» devient «vache» lorsque «at» est remplacé par «ow».Dans votre exemple, $ var et $ {var} sont identiques. Cependant, les accolades sont utiles lorsque vous souhaitez développer la variable dans une chaîne:
Ainsi, les accolades offrent un moyen de substituer la variable afin d'obtenir le nom de la nouvelle variable, elle-même à substituer.
la source
Je le vois généralement plus souvent dans les chaînes. Quelque chose comme ça ne fonctionnera pas:
Mais cela:
Comme vous l'avez bien dit,
$()
est utilisé pour exécuter une commande:Vous pouvez également utiliser des backticks, mais je trouve le
$()
plus polyvalent. D'une part, les backticks ne peuvent pas être (facilement) imbriqués.la source
date_directory=`ls \`date '+%Y-%m-%d'\``
. Mais c'est terriblement moche;$(…)
est beaucoup plus clair et plus facile à utiliser.`…`
était la (seule) syntaxe de substitution de commande pendant des années avant$(…)
a été inventé, de sorte que vous n'avez pas besoin d'imaginer quoi que ce soit - les gens l' ont fait.