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.
wget
bunun ne --mirror --no-host-directories
anlama 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:
bash
yaptığı bir şeydir, bu yüzden $a
bunun 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 cmd
muhtemelen bunun ne anlama geldiğini bilmiyor. cmd $a
genişler cmd -a -b
muhtemelen hangi yapar işi.