sostituendo backtick con $ () non funzionante


17

Ho alcuni vecchi script che provo ad aggiornare. Alcuni dei codici condensano a:

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

che fornisce l'output previsto:

 abc def

Ora Internet mi dice che i backtick sono fuori $()è quello che devo usare, ma quando provo:

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

X non è impostato e viene visualizzato l'errore:

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

Che cosa sto facendo di sbagliato?

Risposte:


27

La $(( … ))sintassi è un'espressione aritmetica .

Ciò che manca è uno spazio tra il $(e il seguente (, per evitare la sintassi dell'espressione aritmetica.

La sezione sulla sostituzione dei comandi nella specifica del linguaggio dei comandi della shell avverte effettivamente che:

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
Va notato che `...`e $(...)avviare comunque una subshell, quindi l'interno (...)non è necessario (sprecare un processo). Avresti bisogno di spazio in cose come $( (...); (...) )per esempio (dove potrebbero essere necessarie le sottostrutture interne).
Stéphane Chazelas,

15

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


Grazie, funziona, ma richiede più editing rispetto all'altra soluzione.
Harold,

2
+1 per includere le virgolette necessarie nella maggior parte delle shell POSIX ( kshed bashessere le uniche eccezioni).
Stéphane Chazelas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.