แทนที่ backtick ด้วย $ () ไม่ทำงาน


17

ฉันมีสคริปต์เก่าที่ฉันพยายามอัปเดต บางส่วนของรหัสควบแน่นไปที่:

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

ซึ่งให้ผลลัพธ์ที่คาดหวัง:

 abc def

ตอนนี้อินเทอร์เน็ตบอกฉันว่า backticks ออกมา$()เป็นสิ่งที่ฉันต้องการใช้ แต่เมื่อฉันลอง:

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

X ไม่ได้ตั้งค่าและฉันได้รับข้อผิดพลาด:

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

ผมทำอะไรผิดหรือเปล่า?

คำตอบ:


27

$(( … ))ไวยากรณ์เป็นการแสดงออกทางคณิตศาสตร์

สิ่งที่ขาดหายไปคือช่องว่างระหว่าง$(และต่อไปนี้(เพื่อหลีกเลี่ยงไวยากรณ์นิพจน์ทางคณิตศาสตร์

ส่วนการทดแทนคำสั่งในข้อมูลจำเพาะภาษาคำสั่งเชลล์เตือนจริง ๆ ว่า:

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
ควรสังเกตว่า`...`และ$(...)เริ่ม subshell ต่อไปดังนั้นจึง(...)ไม่จำเป็นต้องใช้ส่วนใน (เสียกระบวนการ) คุณต้องการพื้นที่ในสิ่งต่าง ๆ เช่น$( (...); (...) )(ซึ่งอาจจำเป็นต้องใช้ subshells ภายใน)
Stéphane Chazelas

15

ลอง export X="$(echo "abc"; echo "def")"


ขอบคุณสิ่งนี้ใช้งานได้ แต่ต้องการการแก้ไขมากกว่าโซลูชันอื่น
แฮโรลด์

2
+1 เพื่อรวมเครื่องหมายคำพูดที่จำเป็นในเชลล์ POSIX ส่วนใหญ่ ( kshและbashเป็นข้อยกเว้นเท่านั้น)
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.