thay thế backtick bằng $ () không hoạt động


17

Tôi có một số kịch bản cũ mà tôi cố gắng cập nhật. Một số mã ngưng tụ để:

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

cung cấp đầu ra dự kiến:

 abc def

Bây giờ internet cho tôi biết backticks $()là những gì tôi cần sử dụng, nhưng khi tôi thử:

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

X không được đặt và tôi gặp lỗi:

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

Tôi đang làm gì sai?

Câu trả lời:


27

Các $(( … ))cú pháp là một biểu thức số học .

Điều còn thiếu là khoảng trắng giữa $(và sau đây (, để tránh cú pháp biểu thức số học.

Phần thay thế lệnh trong đặc tả ngôn ngữ lệnh shell thực sự cảnh báo cho điều đó:

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
Cần lưu ý rằng `...`$(...)bắt đầu một subshell bằng mọi cách, vì vậy (...)không cần thiết bên trong (lãng phí một quá trình). Bạn sẽ cần không gian trong những thứ như $( (...); (...) )ví dụ (nơi có thể cần đến các lớp con bên trong).
Stéphane Chazelas

15

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


Cảm ơn điều này không hoạt động, nhưng đòi hỏi chỉnh sửa nhiều hơn các giải pháp khác.
Harold

2
+1 để bao gồm các trích dẫn cần thiết trong hầu hết các vỏ POSIX ( kshbashlà ngoại lệ duy nhất).
Stéphane Chazelas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.