zamiana backticka na $ () nie działa


17

Mam kilka starych skryptów, które próbuję zaktualizować. Część kodu skraca się do:

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

co daje oczekiwany wynik:

 abc def

Teraz Internet mówi mi, $()że nie mogę użyć backsticksa, ale kiedy próbuję:

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

X nie jest ustawiony i pojawia się błąd:

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

Co ja robię źle?

Odpowiedzi:


27

$(( … ))Składnia jest wyrażenie arytmetyczne .

Brakuje spacji między nimi $(a następującymi (, aby uniknąć składni wyrażeń arytmetycznych.

Sekcja dotycząca zastępowania poleceń w specyfikacji języka poleceń powłoki faktycznie ostrzega przed tym:

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
Należy zauważyć, że `...`i tak $(...)rozpocząć podpowłokę, więc wewnętrzna (...)nie jest potrzebna (marnowanie procesu). $( (...); (...) )Potrzebowałbyś miejsca w takich rzeczach, jak na przykład (gdzie mogą być potrzebne wewnętrzne podpowłoki).
Stéphane Chazelas

15

Próbować export X="$(echo "abc"; echo "def")"


Dzięki temu działa, ale wymaga więcej edycji niż inne rozwiązanie.
Harold

2
+1 za uwzględnienie cudzysłowów, które są potrzebne w większości powłok POSIX ( kshi bashsą jedynymi wyjątkami).
Stéphane Chazelas
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.