2013-06-14 24 views
7

Làm cách nào để ngăn Bash tách các từ trong chuỗi con? Dưới đây là một ví dụ hơi giả tạo để minh họa cho vấn đề:Ngăn chặn tách từ Bash trong chuỗi con

touch file1 'foo bar' 
FILES="file1 'foo bar'" 
ls -la $FILES 

Có thể để có được 'bar foo' coi như là một chuỗi duy nhất bằng lệnh ls trong $ FILES rằng hiệu quả sẽ dẫn đến hành vi tương tự như sau chỉ huy?

ls -la file1 'foo bar' 
+3

Bạn không thể. [Sử dụng một mảng] (http://mywiki.wooledge.org/BashFAQ/050) như kojiro gợi ý. Sử dụng cú pháp chính xác như được hiển thị, dấu ngoặc kép là rất quan trọng. –

Trả lời

14

Sử dụng một mảng: giải pháp mảng

files=(file1 'foo bar') 
ls -la "${files[@]}" 
+0

Cảm ơn. Bối cảnh thực sự là như vậy mà tôi đã có một kịch bản bash (s1.sh) mà từ đó tôi gọi một kịch bản khác (s2.sh). s2.sh lần lượt gọi một lệnh cmd nhị phân và chuyển giá trị của biến môi trường CMD_OPTS làm đối số. Vì vậy, tốt hơn, tôi muốn có thể thiết lập CMD_OPTS trong s1.sh mà không thực sự sửa đổi s2.sh ở tất cả. – marko

+2

@marko: Không thể - bạn phải sửa 's2.sh'. Ngoài ra, hãy đảm bảo các tập lệnh thực sự là các tập lệnh 'bash' chứ không phải tập lệnh'/bin/sh' - vỏ POSIX không hỗ trợ mảng. –

+1

@ richard-hansen: ok, cảm ơn. – marko

2

Kojiro là lựa chọn tốt nhất ở đây. Chỉ cần để trình bày một tùy chọn mà bạn có thể lưu trữ danh sách các tập tin trong FILES với một tách lĩnh vực khác nhau hơn so với khoảng trắng và thiết lập IFS với lĩnh vực tách

OLDIFS=$IFS 
FILES="file1:foo bar" 
IFS=':'; ls -la $FILES 
IFS=$OLDIFS 
Các vấn đề liên quan