Quan điểm của việc sử dụng những gì x x START START_DAEMON | (dẫn đầu x)


7

Đây là một phần của tập lệnh trình nền fetchmail,

if [ ! "x$START_DAEMON" = "xyes" -a ! "$1" = "status" ]; then

Điểm của việc sử dụng là gì x$START_DAEMON = "xyes"; Tại sao không chỉ sử dụng $START_DAEMON = "yes"?

Câu trả lời:


8

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_DAEMONtrong 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$variablesẽ 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/shtrên SunOS 5.10:

 # a="!"; [ "$a" = "yes" ] && echo ok
 test: argument expected

unset a;[ "$a" = "yes" ] && echo okkhông báo cáo lỗi, hmm
daisy

Bạn đúng. Tôi đã thấy những trường hợp x$variablekhông được trích dẫn, và đó có thể là những tình huống testphát sinh vấn đề . Tuy nhiên, sử dụng một ký tự đã biết như thế xsẽ 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.
Lars Rohrbach

1
Nó cũng có thể là một vấn đề trích dẫn vỏ. Ví dụ, Bash 4.2.24 phàn nàn bash: !: event not foundvới ví dụ đã đăng của bạn, nhưng tránh mở rộng lịch sử và a=\!; [[ "$a" = "yes" ]] && echo okthay vào đó hoạt động tốt .
CodeGnome

POSIX bắt buộc phân tích tất cả các testbiể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 xtiề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ư [.
Gilles 'SO- ngừng trở nên xấu xa'
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.