Làm cách nào để sử dụng biến Bash (chuỗi) chứa dấu ngoặc kép trong lệnh?


Câu trả lời:


55

Câu trả lời ngắn: xem BashFAQ # 50 ("Tôi đang cố gắng đặt một lệnh vào một biến, nhưng các trường hợp phức tạp luôn thất bại!").

Câu trả lời dài: Việc đưa các lệnh (hoặc các phần của lệnh) vào các biến và sau đó lấy lại chúng nguyên vẹn là rất phức tạp. Khi shell mở rộng một biến trên dòng lệnh, nếu biến đó nằm trong dấu ngoặc kép thì nó không được phân tích cú pháp; nếu nó không có trong dấu ngoặc kép thì khoảng trắng trong nó được phân tích cú pháp dưới dạng ngắt đối số, nhưng dấu ngoặc kép và thoát không được phân tích cú pháp. Trong cả hai trường hợp, đặt dấu ngoặc kép trong giá trị của biến không có gì hữu ích.

Thông thường, cách tốt nhất để thực hiện loại điều này là sử dụng một mảng thay vì một biến văn bản đơn giản:

FLAGS=(--archive --exclude="foo bar.txt")
rsync "${FLAGS[@]}" dir1 dir2

Holy Jezus nó hoạt động!
Slawomir


-2

Tôi không thấy vấn đề:

$ FLAGS='--archive --exclude="foo bar.txt"'
$ echo $FLAGS
--archive --exclude="foo bar.txt"

Có lẽ bạn cần phải trích dẫn lại giá trị:

$ rsync "$FLAGS" dir1 dir2

5
echokhông thể hiện những gì bạn nghĩ nó là. Hãy thử printargs() { printf "'%s' " "$@"; echo; }; printargs $FLAGS; printargs "$FLAGS"xem tại sao cả hai tùy chọn này không hoạt động.
Gordon Davisson
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.