Nasıl bash joker/yıldız karakteri kaçış mı?
örn.
me$ FOO="BAR * BAR"
me$ echo $FOO
BAR file1 file2 file3 file4 BAR
ve kullanma "" kaçış karakteri: . \
me$ FOO="BAR \* BAR"
me$ echo $FOO
BAR \* BAR
Belli ki aptalca bir şey yapıyorum.
Nasıl çıktı alabilirim "BAR * BAR" ?
CEVAP
KISA CEVAP
Herkesin dediği gibi - her zaman değişkenler garip davranışları önlemek için anlatmalısın. Bu yüzden kullanın"$foo" . echo yerine sadeceecho $foo.
UZUN CEVAP
Bu örnek, daha bunun yüzünde görünebilir daha var, çünkü daha fazla açıklama emirleri düşünüyorum.
Kabuk belli ki yaptığını da karışıklık ilk örnek kaçtın sonra gelir muhtemelen kendi kendine düşündü: görebiliyorum
- Parametre genişleme
- Dosyaismi yorumlaması
İlk örnek:
me$ FOO="BAR * BAR"
me$ echo $FOO
Sonra parametre genişleme eşdeğerdir:
me$ echo BAR * BAR
Ve dosyaismi yorumlaması eşdeğerdir sonra:
me$ echo BAR file1 file2 file3 file4 BAR
Ve sadece komut satırına echo BAR *BAR * * eğer eşdeğer olduğunu göreceksiniz.
Muhtemelen sizin için bu yüzden ben *, filename genişleme engelleyebiliyorum kaçış"
İkinci örnek:
me$ FOO="BAR \* BAR"
me$ echo $FOO
Sonra parametre genişleme eşdeğer olmalıdır:
me$ echo BAR \* BAR
Ve dosyaismi yorumlaması için eşdeğer olmalıdır sonra:
me$ echo BAR \* BAR
Ve eğer yazmaya çalışırsanız "BAR \ *" gerçekten baskı "* BAR filename genişleme kaçış engellenmiştir, çünkü". BAR olacak Komut satırını doğrudan içine BAR echo
Neden $foo kullanarak iş değil yani?
Yer - Alıntı Kaldırılması gereken üçüncü bir genişleme var çünkü. Bash manuel kaldırılması alıntı:
Sonra önceki açılımları, tüm karakterlerin tırnaksız oluşumları ‘ \ ’ , ‘ ’ ve"’ neden değil ‘ açılımları olan bir kaldırıldı.
O yüzden ne olur ne zaman yazdığınız komut doğrudan komut satırı, çıkış karakteri değil sonuç bir önceki genişleme yani BASH kaldırır onu göndermeden önce onu echo komutu, ama 2. örneğin, "\ * " sonuç, bir önceki Parametre genişleme, öyle bir şey YOK, kaldırıldı. Sonuç olarak, echo alır "\*" yazdırır.
İlk örnek arasındaki fark not - "*" Alıntı Temizleme tarafından çıkarılacak olan karakterleri dahil değildir.
Bu mantıklı umuyoruz. Sonunda aynı sonuç - sadece tırnak işaretleri. Ben sadece mantıklı eğer tek Parametre ve Dosyaismi yorumlaması oynayan varsa çalışmalıdır kaçan, işe yaramadı nedenini açıklamak istedim.
BASH açılımları tam bir açıklama için, bakınız:
http://www.gnu.org/software/bash/manual/bashref.html#Shell-Expansions
Nasıl bir bash komut tırnak işaretleri...
Nasıl Bash dize değişkenleri bitiştirm...
Nasıl Bash ayırıcı üzerinde bir dize b...
Nasıl ve bash ile bir dosya için hem s...
Nasıl bash sayı değişkenleri tarafında...