remplacer le backtick par $ () ne fonctionne pas


17

J'ai d'anciens scripts que j'essaie de mettre à jour. Une partie du code se condense en:

 export X=`(echo "abc"; echo "def")`
 echo $X

ce qui donne la sortie attendue:

 abc def

Maintenant, Internet me dit que les backticks sont supprimés $(), mais que lorsque j'essaie:

export X=$((echo "abc"; echo "def"))

X n'est pas défini et j'obtiens l'erreur:

bash: echo "abc"; echo "def": syntax error: invalid arithmetic operator (error token is ""abc"; echo "def"")

Qu'est-ce que je fais mal?

Réponses:


27

La $(( … ))syntaxe est une expression arithmétique .

Ce qui manque, c'est un espace entre le $(et le suivant (, pour éviter la syntaxe d'expression arithmétique.

La section sur la substitution de commandes dans la spécification du langage de commande shell avertit en fait:

If the command substitution consists of a single subshell, such as:

   $( (command) )

a conforming application shall separate the "`$(`" and '`(`' into two tokens
(that is, separate them with white space). This is required to avoid any
ambiguities with arithmetic expansion.

21
Il convient de noter que `...`et $(...)démarrer un sous-shell de toute façon, de sorte que l'intérieur (...)n'est pas nécessaire (gaspiller un processus). Vous auriez besoin d'espace dans des choses comme $( (...); (...) )par exemple (où les sous-coques internes peuvent être nécessaires).
— Stéphane Chazelas

15

Essayer export X="$(echo "abc"; echo "def")"


Merci, cela fonctionne, mais nécessite plus de modifications que l'autre solution.
— Harold

2
+1 pour inclure les guillemets nécessaires dans la plupart des shells POSIX ( kshet bashétant les seules exceptions).
— Stéphane Chazelas
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.