Câu trả lời:
Tôi đã nhìn thấy trường hợp x$variable
đã không trích dẫn, và trong trường hợp đó nó để xử lý tình huống mà biến ( $START_DAEMON
trong trường hợp này) có thể là rỗng. Nếu không, kiểm tra của bạn sẽ kiểm tra xem ! = "yes"
, và kiểm tra sẽ lỗi. Tuy nhiên, như bạn đã chỉ ra trong các bình luận, trích dẫn hai lần x$variable
sẽ quan tâm đến vấn đề này.
Mặt khác, một câu hỏi trên ServerFault đã đưa tôi đến trang này: http://pub.opengroup.org/onlinepub/009695399/utilities/test.html , trong đó một người đang ngăn chặn việc mở rộng biến bắt đầu bằng một ký tự có thể gây nhầm lẫn [
hoặc làtest
Mặc dù vậy, tôi nghĩ rằng đây là một vấn đề có thể chỉ là vấn đề trong các vỏ cũ ("Lịch sử" như trang opengroup nói), và các triển khai mới hơn làm đúng mà không cần x
, miễn là trích dẫn hai lần . Vì vậy, nó có thể chủ yếu là một truyền thống mã hóa. Tôi đã có thể xác nhận sự cố khi sử dụng /bin/sh
trên SunOS 5.10:
# a="!"; [ "$a" = "yes" ] && echo ok
test: argument expected
x$variable
không được trích dẫn, và đó có thể là những tình huống test
phát sinh vấn đề . Tuy nhiên, sử dụng một ký tự đã biết như thế x
sẽ ngăn các vấn đề khác với các ký tự đặc biệt - tôi sẽ cập nhật câu trả lời.
bash: !: event not found
với ví dụ đã đăng của bạn, nhưng tránh mở rộng lịch sử và a=\!; [[ "$a" = "yes" ]] && echo ok
thay vào đó hoạt động tốt .
test
biểu thức chính xác lên đến ba mã thông báo, chẳng hạn như biểu thức này. Vỏ Bourne lịch sử là lỗi. Các x
tiền tố làm cho rõ ràng trái sang phải phân tích cú pháp. Dấu ngoặc kép là cần thiết trong bất kỳ shell nào, trong trường hợp giá trị của biến trống, chứa khoảng trắng, v.v ... Dấu ngoặc kép không cần thiết bên trong [[…]]
đó là cú pháp đặc biệt, không phải là tiện ích tích hợp đơn thuần như [
.
unset a;[ "$a" = "yes" ] && echo ok
không báo cáo lỗi, hmm