Tôi đọc về điều đó tôi nên trích dẫn các biến trong bash, ví dụ "$ foo" thay vì $ foo. Tuy nhiên, trong khi viết một kịch bản, tôi đã tìm thấy một trường hợp nó hoạt động mà không có dấu ngoặc kép nhưng không phải với chúng:
wget_options='--mirror --no-host-directories'
local_root="$1" # ./testdir recieved from command line
remote_root="$2" # ftp://XXX recieved from command line
relative_path="$3" # /XXX received from command line
Cái này hoạt động:
wget $wget_options --directory_prefix="$local_root" "$remote_root$relative_path"
Điều này không có (lưu ý các trích dẫn kép aroung $ wget_options):
wget "$wget_options" --directory_prefix="$local_root" "$remote_root$relative_path"
Lý do cho điều này là gì?
Là dòng đầu tiên là phiên bản tốt; hoặc tôi nên nghi ngờ rằng có một lỗi ẩn ở đâu đó gây ra hành vi này?
Nói chung, tôi tìm tài liệu tốt ở đâu để hiểu cách bash và trích dẫn của nó hoạt động? Trong khi viết kịch bản này, tôi cảm thấy rằng tôi đã bắt đầu làm việc trên cơ sở thử và sai thay vì hiểu các quy tắc.
wget
không biết --mirror --no-host-directories
nghĩa là gì (như một đối số), nhưng nó xử lý nó khi nó được chia thành hai đối số. Rất ít chương trình xử lý không gian và trích dẫn đặc biệt một khi chúng nằm trong vectơ đối số. Vấn đề là ở chỗ bash
, và các vỏ khác, có nghĩa là>
bash
, vì vậy bạn có thể tưởng tượng nó $a
hoàn toàn tương đương với việc viết trực tiếp nội dung của nó. Bây giờ vấn đề đã rõ ràng: a="-a -b"; cmd "$a"
mở rộng ra cmd "-a -b"
, nhưng cmd
có lẽ không biết điều đó có nghĩa là gì. cmd $a
mở rộng đến cmd -a -b
, mà có lẽ không hoạt động.