Ben bash, örneğin "$ foo" yerine $ foo değişkenleri alıntı gerektiğini okumuştum. Ancak, bir senaryo yazarken, tırnak işaretleri olmadan çalıştığı ancak onlarla çalışmadığı bir durum buldum:
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
Bu işe yarıyor:
wget $wget_options --directory_prefix="$local_root" "$remote_root$relative_path"
Bu ($ wget_options ile ilgili çift tırnaklara dikkat edin):
wget "$wget_options" --directory_prefix="$local_root" "$remote_root$relative_path"
Bunun nedeni nedir?
İlk satır iyi sürüm; veya bu davranışa neden olan bir yerde gizli bir hata olduğundan şüphelenmeli miyim?
Genel olarak, bash ve alıntılarının nasıl çalıştığını anlamak için iyi belgeleri nerede bulabilirim? Bu senaryoyu yazarken, kuralları anlamak yerine deneme yanılma temelinde çalışmaya başladığımı hissediyorum.
wgetbunun ne --mirror --no-host-directoriesanlama geldiğini bilmediğini görüyorsunuz (tek bir argüman olarak), ancak iki argümana ayrıldığında bunu ele alıyor . Çok az sayıda program, argüman vektörünün içine girdikten sonra boşlukları ve alıntıları özel olarak ele alır. Sorun şu ki bash, ve diğer mermiler şu şekilde olmalıdır:
bashyaptığı bir şeydir, bu yüzden $abunun içeriğini doğrudan yazmakla tam olarak eşdeğer olduğunu hayal edebilirsiniz . Şimdi sorun ortada: a="-a -b"; cmd "$a"genişliyor cmd "-a -b", ama cmdmuhtemelen bunun ne anlama geldiğini bilmiyor. cmd $agenişler cmd -a -bmuhtemelen hangi yapar işi.