İlk önce, zsh'ı diğerlerinden ayırın. Eski ve modern kabukları ilgilendirmez: zsh farklı davranır. Zsh tasarımcıları geleneksel kabukları ile uyumsuz hale getirmeye karar verdiler (Bourne, ksh, bash), ancak kullanımı daha kolay.
İkincisi, her zaman çift tırnak kullanmak, gerektiğinde hatırlamaktan çok daha kolaydır. Çoğu zaman ihtiyaç duyulur, bu yüzden ihtiyaç duyulduğunda değil, ihtiyaç duyulmadığında öğrenmeniz gerekir.
Özet olarak, bir kelime veya kalıp listesinin beklendiği yerde çift tırnak işareti gerekir . Ayrıştırıcı tarafından işlenmemiş bir dizgenin beklendiği bağlamlarda isteğe bağlıdır.
Tırnaksız ne olur?
Çift tırnak olmadan, iki şey olduğunu unutmayın.
- İlk olarak, genişlemenin sonucu (gibi bir parametre değişiminin değişkeni değeri
${foo}
veya benzeri bir komut değişiminin komutu çıktısı $(foo)
), boşluk içerdiği her yerde kelimelere ayrılır.
Daha doğrusu, genişlemenin sonucu, IFS
değişkenin değerinde görünen her karakterde bölünür (ayırıcı karakter). Bir ayırıcı karakter dizisi boşluk içeriyorsa (boşluk, sekme veya yeni satır), boşluk tek bir karakter olarak sayılır; öndeki, takip eden veya tekrarlanan boşluk olmayan ayırıcılar boş alanlara neden olur. Örneğin, ile IFS=" :"
, :one::two : three: :four
önce boş alanlar üretir one
arasında, one
ve two
bir aralığa, ve (tek bir) three
ve four
.
- Bölünmeden kaynaklanan her alan karakterlerden birini içeriyorsa glob (joker desen) olarak yorumlanır
\[*?
. Bu model bir veya daha fazla dosya adıyla eşleşiyorsa, model eşleşen dosya adları listesi ile değiştirilir.
Bir tırnaksız değişken genişleme $foo
halk dilinde aksine “bölünmüş + glob operatörü” olarak bilinen "$foo"
sadece değişkenin değerini aldığı foo
. Aynı şey komut değiştirme için de geçerli: "$(foo)"
bir komut değiştirme işlemi, $(foo)
ardından split + glob adlı bir komut değiştirme işlemi.
Çifte alıntıyı ihmal edebileceğiniz yer
İşte, Bourne tarzı bir kabukta düşünebildiğim tüm değişkenler, değişken veya komut yerine koyma işlemi olmadan çift tırnak işareti yazabilirsiniz ve değer tam anlamıyla yorumlanır.
Bir ödevin sağ tarafında.
var=$stuff
a_single_star=*
export
Bir anahtar kelime değil, sıradan bir yerleşik olduğundan, sonra çift tırnak işaretine ihtiyacınız olduğunu unutmayın . Bu sadece kısa çizgi, zsh (öykünme modunda), yash veya posh gibi bazı kabuklarda doğrudur; bash ve ksh, ikisine de export
özel muamele yapar .
export VAR="$stuff"
Bir case
açıklamada.
case $var in …
Bir vaka düzeninde çift tırnak kullanmanız gerektiğini unutmayın. Sözcük bölme, bir vaka düzeninde gerçekleşmez, ancak bir alıntı olmayan değişken değişkeni bir dize olarak yorumlanırken, alıntılanmamış bir değişken bir model olarak yorumlanır.
a_star='a*'
case $var in
"$a_star") echo "'$var' is the two characters a, *";;
$a_star) echo "'$var' begins with a";;
esac
İkili dirsek içinde. Çift köşeli ayraçlar kabuk özel sözdizimidir.
[[ -e $filename ]]
Sağ tarafında: Bunun dışında bir desen veya normal ifade beklenen çift tırnak gerekiyor =
ya ==
ya !=
ya =~
.
a_star='a*'
if [[ $var == "$a_star" ]]; then echo "'$var' is the two characters a, *"
elif [[ $var == $a_star ]]; then echo "'$var' begins with a"
fi
Tek parantez içinde her zamanki gibi çift tırnak işareti kullanmanız gerekir, [ … ]
çünkü bunlar sıradan kabuk sözdizimidir (çağrılan bir komuttur [
). Bkz tek veya çift parantez
Etkileşimli olmayan POSIX kabuklarında yeniden yönlendirme (değil bash
, ne de ksh88
).
echo "hello world" >$filename
Bazı kabuklar, etkileşimli olduğunda, değişkenin değerini joker desen olarak görür. POSIX etkileşimli olmayan kabuklarda davranışı yasaklar, ama ((sözde) POSIX gibi bulunca dahil olmak üzere birkaç (POSIX modunda hariç) bash dahil kabukları ve ksh88 sh
Solaris gibi bazı ticari Unix'lerde arasında) hala orada (bunu bash
da teşebbüs etmez bölme bu sürece ve yönlendirme başarısız bölünmüş globbing + tam olarak bir kelimeyle sonuçları makul bir sürede yönlendirmeler hedeflerini alıntı daha iyidir, o yüzden) sh
bir dönüştürmek istediğiniz durumda komut bash
nerede bir sistem üzerinde bir gün komut dosyası veya koşmak sh
olduğunu o noktada uyumlu olmayan veya etkileşimli mermilerden kaynaklanmış olabilir .
Bir aritmetik ifadenin içinde. Aslında, bir değişkenin aritmetik bir ifade olarak ayrıştırılması için tırnak işaretleri bırakmanız gerekir.
expr=2*2
echo "$(($expr))"
Bununla birlikte, POSIX'in gerektirdiği (!?) Çoğu kabukta kelime bölmeye tabi olduklarından, aritmetik genişlemenin etrafındaki tırnaklara ihtiyacınız var.
Bir ilişkisel dizi alt komutunda.
typeset -A a
i='foo bar*qux'
a[foo\ bar\*qux]=hello
echo "${a[$i]}"
Belirtilmeyen bir değişken ve komut değiştirme bazı nadir durumlarda faydalı olabilir:
- Değişken değer veya komut çıktısı glob kalıplarının bir listesinden oluştuğunda ve bu kalıpları eşleşen dosyalar listesine genişletmek istediğinizde.
- Değerin herhangi bir joker karakter içermediğini bildiğiniz zaman, bu
$IFS
değiştirilmemiş ve boşluk karakterlerine bölmek istiyorsunuz.
- Belirli bir karakterde bir değer bölmek istediğinizde: ile globbing devre dışı
set -f
set, IFS
ardından genişleme yapmak, ayırıcı karakteri (ya da boşluktan bölmek yalnız bırakın).
zsh
Zsh'de, birkaç istisna dışında çoğu zaman çift tırnak işaretini çıkartabilirsiniz.
$var
hiçbir zaman birden fazla kelimeye genişlemez, ancak değeri var
boş dize ise boş listeye (tek, boş bir kelime içeren bir listenin aksine) genişler . Kontrast:
var=
print -l $var foo # prints just foo
print -l "$var" foo # prints an empty line, then foo
Benzer şekilde, "${array[@]}"
dizinin tüm öğelerine $array
genişlerken , yalnızca boş olmayan öğelere genişler.
@
Parametre genişletme bayrak bazen bütün ikame sonuna çift tırnak gerektirir: "${(@)foo}"
.
Komut ikame edilmemişse alan bölünmesine uğrar: değiştirilmemiş iki satırlı dizgeyi echo $(echo 'a'; echo '*')
yazdırırken a *
(tek boşlukla) echo "$(echo 'a'; echo '*')"
yazdırır. "$(somecommand)"
Komutun çıktısını tek bir kelimeyle almak için kullanın , son satırları gönderin. "${$(somecommand; echo _)%?}"
Son satırsonları dahil olmak üzere komutun tam çıktısını almak için kullanın . "${(@f)$(somecommand)}"
Komutun çıktısından bir dizi satır almak için kullanın .
SH_WORD_SPLIT
seçenek tarafından etkilenir .