web-dev-qa-db-fra.com

Contre-coups vs accolades dans Bash

Quand je suis allé répondre cette question , j'allais utiliser le ${} notation, comme je l'ai vu tant de fois ici, c'est préférable aux backticks.

Cependant, quand j'ai essayé

joulesFinal=${echo $joules2 \* $cpu | bc}

J'ai eu le message

-bash: ${echo $joules * $cpu | bc}: bad substitution

mais

joulesFinal=`echo $joules2 \* $cpu | bc`

fonctionne bien. Quels autres changements dois-je apporter?

40
rojomoke

`` Est appelé Substitution de commandes et équivaut à $() (parenthèses), pendant que vous utilisez ${} (Accolades).

Donc, ceux-ci sont égaux et signifient "interpréter la commande placée à l'intérieur":

joulesFinal=`echo $joules2 \* $cpu | bc`
joulesFinal=$(echo $joules2 \* $cpu | bc)
             ^                          ^
       ( instead of {             ) instead of }

Tandis que les expressions ${} Sont utilisées pour la substitution de variables.


De man bash:

La substitution de commande permet à la sortie d'une commande de remplacer le nom de la commande. Il existe deux formes:

          $(command)
   or
          `command`

De plus, `` Sont plus difficiles à gérer, vous ne pouvez pas les imbriquer par exemple. Voir les commentaires ci-dessous et aussi Pourquoi $ (...) est-il préféré à ... (Backticks)? .

67
fedorqui

Ils se comportent légèrement différemment dans des cas spécifiques:

$ echo "`echo \"test\" `"
test
$ echo "$(echo \"test\" )"
"test"

donc les backticks suppriment silencieusement les guillemets doubles.

21
Gunstick