Я читав про це, я повинен навести змінні в 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, що, ймовірно , працює.