backtick yerine $ () çalışmıyor


17

Güncellemeye çalıştığım bazı eski scriptlerim var. Kodun bazıları:

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

beklenen çıktıyı verir:

 abc def

Şimdi internet bana backticks dışarı $()kullanmam gerektiğini söyler , ama denediğimde:

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

X ayarlanmadı ve hatayı alıyorum:

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

Neyi yanlış yapıyorum?

Yanıtlar:


27

$(( … ))Söz diziminin, bir bir aritmetik ifade .

Eksik olan , aritmetik ifade sözdiziminden kaçınmak için $(aşağıdakilerle aşağıdakiler arasındaki boşluktur (.

Kabuk komut dili belirtimindeki komut değiştirme bölümü aslında bunun için uyarır:

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
Unutulmamalıdır `...`ve $(...)yine de bir alt kabuk başlatın, böylece iç tarafa (...)ihtiyaç yoktur (bir işlemi boşa harcamayın). $( (...); (...) )Mesela (iç alt kabuklara ihtiyaç duyulabilecek) gibi şeylerde alana ihtiyacınız olacaktır.
Stéphane Chazelas

15

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


Teşekkürler bu işe yarıyor, ancak diğer çözümden daha fazla düzenleme gerektiriyor.
Harold

2
Çoğu POSIX kabuğunda gerekli olan tırnak işaretlerini dahil etmek için +1 ( kshve bashtek istisnalar).
Stéphane Chazelas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.