Je suis ce guide de script shell bash:
Dans la section Comparaisons numériques, il cite un exemple:
anny > num=`wc -l work.txt`
anny > echo $num
201
anny > if [ "$num" -gt "150" ]
More input> then echo ; echo "you've worked hard enough for today."
More input> echo ; fi
Ce qui semble se produire ci-dessus, c'est que nous stockons une chaîne de commandes dans une variable bash, puis nous invoquons l'écho sur la variable. Ce qui semble se produire, c'est que la chaîne est évaluée et que la commande wc est exécutée et renvoie le nombre de lignes au terminal de contrôle.
Ok, donc je lance mon terminal dans Ubuntu 12.04 et j'essaye quelque chose de similaire:
$ touch sample.txt && echo "Hello World" > sample.txt
$ cat sample.txt
Hello World
$ num='wc -l sample.txt'
echo $num
wc -l sample.txt
Attendez une seconde, cela n'a pas évalué la chaîne et renvoyé le nombre de lignes. Cela vient de renvoyer la chaîne au terminal. Pourquoi ai-je obtenu des résultats différents?
command-line
bash
scripts
JohnMerlino
la source
la source
wc -l work.txt
, mais au numéro 201.Réponses:
Vous devez utiliser des backticks pour évaluer l'expression.
Si vous ne voulez voir que "1" dans la sortie, utilisez la commande
Et fonctionne également:
Pour plus d'informations, voir Différences entre les guillemets doubles "", les guillemets simples "et les astuces" ´ sur la ligne de commande?
la source
wc
commande. Essayezcat sample.txt | wc -l
.Veuillez noter ce symbole:
Simple citation
et
Backquote
Ainsi, le backquote renvoie le résultat de la commande à la sortie standard. C'est pourquoi
renvoie les résultats de la commande, tandis que
il suffit de retourner "wc -l sample.txt" comme une chaîne habituelle
Pensez à faire cela comme exemple:
Et maintenant, faites écho aux trois variables:
la source
Si vous souhaitez capturer la sortie d'une commande dans une variable, vous devez soit utiliser des raccourcis,
``
soit placer la commande dans$()
:Notez que la chaîne est réellement évaluée au moment de la déclaration de variable, pas lorsque vous l'écho. La commande est en fait exécutée dans le
$()
ou les backticks et la sortie de cette commande est enregistrée en tant que valeur de la variable.En général, vous devez toujours utiliser
$()
au lieu de backticks qui sont obsolètes et uniquement autour pour des raisons de compatibilité et beaucoup plus limités. Vous ne pouvez pas, par exemple, imbriquer des commandes dans des backticks mais vous pouvez avec$()
:Voir ce fil sur U&L pour plus de détails sur les raisons
``
à éviter.la source
$(
)
à`
`
. Mais comme dit WAG , backquotes font nid.echo $(date -d $(echo yesterday))
devientecho `date -d \`echo yesterday\``
;echo $(echo $(date -d $(echo yesterday)))
devientecho `echo \`date -d \\\`echo yesterday\\\`\``
. Je dis que cela ne réfute pas votre thèse mais pour la renforcer : les citations internes échappées rendent la`
`
syntaxe plus puissante que ce qui est souvent admis, mais un traitement spécial\
est étrange, surprenant et difficile à raisonner. Ce$(
)
que vous voyez est généralement ce que vous obtenez.