NGẮN ĐÁP
Giống như những người khác đã nói - bạn nên luôn luôn trích dẫn các biến để ngăn chặn hành vi kỳ lạ. Vì vậy, hãy sử dụng tiếng vang "$ foo" thay vì chỉ echo $ foo.
DÀI ĐÁP
Tôi nghĩ rằng ví dụ ích này là do giải thích thêm vì có nhiều diễn ra bên ngoài nó có vẻ trên khuôn mặt của nó.
tôi có thể nhìn thấy nơi sự nhầm lẫn của mình do thỏa thuận hợp vì sau khi bạn chạy ví dụ đầu tiên của bạn, bạn có thể nghĩ đến bản thân mà vỏ được rõ ràng thực hiện:
- mở rộng Parameter
- mở rộng ảnh Tên
Vì vậy, từ ví dụ đầu tiên của bạn:
me$ FOO="BAR * BAR"
me$ echo $FOO
A fter mở rộng tham số tương đương với:
me$ echo BAR * BAR
Và sau khi mở rộng tên tập tin là tương đương với:
me$ echo BAR file1 file2 file3 file4 BAR
Và nếu bạn chỉ cần gõ echo BAR * BAR
vào dòng lệnh, bạn sẽ thấy rằng họ là tương đương.
Vì vậy, bạn có thể nghĩ đến bản thân "nếu tôi thoát khỏi *, tôi có thể ngăn chặn việc mở rộng tên tập tin"
Vì vậy, từ ví dụ thứ hai của bạn:
me$ FOO="BAR \* BAR"
me$ echo $FOO
Sau khi mở rộng tham số phải tương đương với:
me$ echo BAR \* BAR
Và sau khi mở rộng tên tập tin nên được tương đương với:
me$ echo BAR \* BAR
Và nếu bạn thử gõ "echo BAR \ * BAR" trực tiếp vào dòng lệnh, nó thực sự sẽ in "BAR * BAR" vì việc mở rộng tên tệp được ngăn chặn bằng cách thoát.
Vậy tại sao việc sử dụng $ foo không hoạt động?
Đó là vì có bản mở rộng thứ ba diễn ra - Trích dẫn xóa. Từ bash loại bỏ bằng tay quote là:
Sau khi mở rộng trước, tất cả lần xuất hiện không thể viện chứng của các nhân vật '\', ''', và '"' mà không gây từ một trong những bản mở rộng trên là gỡ bỏ.
vì vậy, những gì xảy ra là khi bạn gõ lệnh trực tiếp vào dòng lệnh, các ký tự thoát không phải là kết quả của một sự mở rộng trước đó để BASH loại bỏ nó trước khi gửi nó vào lệnh echo, nhưng trong ví dụ thứ 2, "\ *" là kết quả của việc mở rộng Tham số trước đó, vì vậy nó KHÔNG bị loại bỏ Kết quả là, echo nhận được "\ *" và đó là những gì nó in.
Lưu ý sự khác biệt giữa ví dụ đầu tiên - "*" không được bao gồm trong các ký tự sẽ bị xóa bởi Trích dẫn xóa.
Tôi hy vọng điều này có ý nghĩa. Cuối cùng kết luận trong cùng - chỉ cần sử dụng dấu ngoặc kép. Tôi chỉ nghĩ rằng tôi sẽ giải thích lý do tại sao thoát, mà hợp lý nên làm việc nếu chỉ có Parameter và mở rộng tên tập tin đang chơi, không hoạt động.
Đối với một giải thích đầy đủ các hoạt động mở BASH, hãy tham khảo:
http://www.gnu.org/software/bash/manual/bashref.html#Shell-Expansions
điều này là bí ẩn, tại sao điều này? những gì đang xảy ra? – tofutim