Saya membaca bahwa saya harus mengutip variabel dalam bash, misalnya "$ foo", bukan $ foo. Namun, saat menulis skrip, saya menemukan sebuah kasus di mana ia bekerja tanpa tanda kutip tetapi tidak dengan mereka:
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
Yang ini berfungsi:
wget $wget_options --directory_prefix="$local_root" "$remote_root$relative_path"
Yang ini tidak (perhatikan tanda kutip ganda aroung $ wget_options):
wget "$wget_options" --directory_prefix="$local_root" "$remote_root$relative_path"
Apa alasannya?
Apakah baris pertama versi yang bagus; atau haruskah saya curiga ada kesalahan tersembunyi di suatu tempat yang menyebabkan perilaku ini?
Secara umum, di mana saya menemukan dokumentasi yang bagus untuk memahami bagaimana bash dan penawarannya bekerja? Selama menulis skrip ini, saya merasa mulai bekerja dengan dasar coba-coba alih-alih memahami aturan.
wget
tidak tahu apa --mirror --no-host-directories
artinya (sebagai satu argumen), tetapi itu menanganinya ketika itu dibagi menjadi dua argumen. Sangat sedikit program yang memperlakukan spasi dan kutipan secara khusus begitu mereka berada di dalam vektor argumen. Masalahnya adalah bahwa bash
, dan kerang lainnya, dimaksudkan untuk menjadi>
bash
dilakukan, sehingga Anda dapat membayangkan bahwa $a
persis sama dengan langsung menulis kontennya. Sekarang masalahnya sudah jelas: a="-a -b"; cmd "$a"
diperluas cmd "-a -b"
, tetapi cmd
mungkin tidak tahu apa artinya itu. cmd $a
mengembang untuk cmd -a -b
, yang mungkin tidak bekerja.