Я читав про це, я повинен навести змінні в bash, наприклад "$ foo" замість $ foo. Однак під час написання сценарію я знайшов випадок, коли він працює без лапок, але не з ними:
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
Цей працює:
wget $wget_options --directory_prefix="$local_root" "$remote_root$relative_path"
Цього немає (зверніть увагу на подвійні лапки навколо $ wget_options):
wget "$wget_options" --directory_prefix="$local_root" "$remote_root$relative_path"
У чому причина цього?
Чи є перший рядок гарною версією; чи варто підозрювати, що десь є прихована помилка, яка спричиняє таку поведінку?
Загалом, де я можу знайти гарну документацію, щоб зрозуміти, як працює bash та його цитування? Під час написання цього сценарію я відчуваю, що почав працювати над базою проб і помилок замість розуміння правил.
wget
не знає, що --mirror --no-host-directories
означає (як один аргумент), але він обробляє це, коли він розділений на два аргументи. Дуже мало програм спеціально обробляє пробіли та цитати, коли вони знаходяться всередині аргументу. Проблема полягає в тому bash
, що і інші снаряди мають на увазі бути>
bash
, тому ви можете уявити, що $a
це рівнозначно безпосередньо написанню його вмісту. Тепер питання очевидно: a="-a -b"; cmd "$a"
розширюється до cmd "-a -b"
, але, cmd
ймовірно, не знає, що це означає. cmd $a
розширюється до cmd -a -b
, що, ймовірно , працює.