mengganti backtick dengan $ () tidak berfungsi


17

Saya memiliki beberapa skrip lama yang saya coba perbarui. Beberapa kode mengembun ke:

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

yang memberikan output yang diharapkan:

 abc def

Sekarang internet memberi tahu saya bahwa backticks keluar $()adalah apa yang perlu saya gunakan, tetapi ketika saya mencoba:

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

X tidak diatur dan saya mendapatkan kesalahan:

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

Apa yang saya lakukan salah?

Jawaban:


27

The $(( … ))sintaks adalah ekspresi aritmatika .

Yang hilang adalah ruang antara $(dan yang berikut (, untuk menghindari sintaks ekspresi aritmatika.

Bagian substitusi perintah dalam spesifikasi bahasa perintah shell sebenarnya memperingatkan untuk itu:

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
Perlu dicatat bahwa `...`dan $(...)memulai subkulit pula, sehingga bagian dalam (...)tidak diperlukan (buang proses). Anda akan membutuhkan ruang dalam hal-hal seperti $( (...); (...) )misalnya (di mana subkulit dalam mungkin diperlukan).
Stéphane Chazelas

15

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


Terima kasih ini berhasil, tetapi membutuhkan lebih banyak pengeditan daripada solusi lainnya.
Harold

2
+1 untuk menyertakan kutipan yang diperlukan di sebagian besar shell POSIX ( kshdan bashmenjadi satu-satunya pengecualian).
Stéphane Chazelas
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.