KISA CEVAP
diğerleri söylediler gibi - her zaman garip davranışları önlemek için değişkenleri alıntı olmalıdır. Bu yüzden echo $ foo yerine echo "$ foo" kullanın.
UZUN YANIT
Daha bunun yüzünde göründüğünden daha oluyor, çünkü bu örnek daha fazla açıklama garanti düşünüyorum.
- Parametre genişletme
- Dosya adı genişleme
: En karışıklık Eğer kabuk açıkçası yaptığını muhtemelen kendinize düşünce ilk örneğini koştu çünkü sonra devreye giriyor
Görebildiğim Yani ilk örneğinizden:
me$ FOO="BAR * BAR"
me$ echo $FOO
A fter parametre genişleme eşdeğerdir:
me$ echo BAR * BAR
Ve Dosyaismi sonra eşdeğerdir:
me$ echo BAR file1 file2 file3 file4 BAR
Ve sadece komut satırına echo BAR * BAR
yazarsanız onlar eşdeğer olduğunu göreceksiniz.Parametre genişleme sonra
me$ FOO="BAR \* BAR"
me$ echo $FOO
denk olmalıdır:
Yani muhtemelen ikinci örnekten Yani
"Ben * kaçmak, ben dosya adı genişlemesini önleyebilir" Kendine düşünülen
me$ echo BAR \* BAR
Ve dosyaismi sonra olmalıdır eşdeğer:
me$ echo BAR \* BAR
Ve "echo BAR \ * BAR" komutunu doğrudan komut satırına yazmayı denerseniz, "BAR * BAR" yazdıracağından, dosya adı genişletme engellenerek önlenir.
Peki neden $ foo kullanmıyorsunuz?
Çünkü üçüncü bir genişleme gerçekleşir - Alıntı Kaldırma. bash manuel tırnak kaldırma itibaren geçerli: önceki açılımları sonra
, yukarıdaki açılımları birinden yol açmamıştır karakterler '\', ''' ve '' "her tırnaksız olaylar vardır kaldırıldı.
Yani komut satırına doğrudan komutu yazdığınızda edilir ne olur, kaçış karakteri BASH yankı komuta göndermeden önce kaldırır, böylece bir önceki genişleme sonucu değildir, ama içinde İkinci örnekte, "\ *" bir önceki Parametre genişletmesinin sonucuydu, bu yüzden DEĞİLDİR Sonuç olarak, echo "\ *" alır ve bu da yazdırır.
İlk örnek arasındaki fark dikkat edin - "*", Kaldırma Kaldırma tarafından kaldırılacak olan karakterlere dahil değildir.
Umarım bu mantıklıdır. Sonunda sonuç aynı - sadece alıntılar kullanın. Sadece Parameter ve Filename genişletmenin oynadığı durumlarda mantıken işe yarayan kaçış nedenini açıklayacağımı düşündüm. Bu eski konuya biraz eklemek gerekir
http://www.gnu.org/software/bash/manual/bashref.html#Shell-Expansions
Bu gizemli, neden bu? ne oluyor? – tofutim