repo
Komut o alır tırnak ne tür umursayamazsınız. Parametre genişletmeye ihtiyacınız varsa, çift tırnak kullanın. Bu, birçok şeyi ters eğmek zorunda kaldığınız anlamına gelirse, çoğu için tek tırnak kullanın ve ardından bunları genişletin ve genişlemenin gerçekleşmesi gereken kısım için iki katına çıkın.
repo forall -c 'literal stuff goes here; '"stuff with $parameters here"' more literal stuff'
İlgileniyorsanız açıklama gelir.
Kabuktan bir komut çalıştırdığınızda, bu komutun bağımsız değişken olarak aldığı şey null sonlu dizelerden oluşan bir dizidir. Bu dizeleri kesinlikle içerebilir herhangi boş olmayan karakter.
Ancak kabuk, komut dizesinden bu dizeleri oluştururken, bazı karakterleri özel olarak yorumlar; bu komutların yazılmasını daha kolay (gerçekten mümkün) yapmak için tasarlanmıştır. Örneğin, boşluklar normalde dizideki dizeler arasındaki sınırı belirtir; bu nedenle, münferit argümanlara bazen "kelimeler" denir. Ancak yine de bir argümanın içinde boşluklar olabilir; sadece mermiye bunu istediğini söylemek için bir yola ihtiyacın var.
Kabuğa bu karakteri tam anlamıyla tedavi etmesini bildirmek için herhangi bir karakterin (boşluk veya başka bir ters eğik çizgi dahil) önünde ters eğik çizgi kullanabilirsiniz. Ama böyle bir şey yapabilirken:
echo \"Thank\ you.\ \ That\'ll\ be\ \$4.96,\ please,\"\ said\ the\ cashier
... yorucu olabilir. Kabuk bir alternatif sunar: tırnak işaretleri. Bunlar iki ana çeşittir.
Çift tırnak işaretleri "gruplama tırnakları" olarak adlandırılır. Joker karakterlerin ve takma adların genişletilmesini önlerler, ancak çoğunlukla bir kelimeye boşluk eklemek içindir. Parametre ve komut genişletme (a ile işaret edilen şeyler) gibi diğer şeyler $
hala olur. Ve tabii ki çift tırnak içinde gerçek bir çift tırnak istiyorsanız, ters eğik çizgi yapmanız gerekir:
echo "\"Thank you. That'll be \$4.96, please,\" said the cashier"
Tek tırnak işaretleri daha acımasızdır. Aralarındaki her şey, ters eğik çizgiler de dahil olmak üzere tam anlamıyla alınır. Tek tırnak içine gerçek bir tek alıntı almanın kesinlikle bir yolu yoktur.
Neyse ki, kabuktaki tırnak işaretleri sözcük sınırlayıcılar değildir ; kendi başlarına bir kelimeyi sonlandırmazlar. İstediğiniz sonucu elde etmek için aynı sözcük içinde farklı tırnak türleri arasında dahil olmak üzere tırnak içine girip çıkabilirsiniz:
echo '"Thank you. That'\''ll be $4.96, please," said the cashier'
Bu daha kolay - çok daha az ters eğik çizgi, yakın-tek tırnak, ters eğik-gerçek-tek tırnak, açık-tek tırnak dizisi alışmak biraz zaman alıyor.
Modern mermiler, POSIX standardında belirtilmeyen başka bir teklif stili ekledi, burada önde gelen tek tırnak işaretinin önüne dolar işareti eklendi. Bu şekilde alıntılanan dizeler, ANSI C programlama dilinde dizgi değişmezlerine benzer kuralları izler ve bu nedenle bazen "ANSI dizeleri" olarak adlandırılır ve $'
... '
"ANSI tırnakları" çifti olarak adlandırılır . Bu tür dizelerde, ters eğik çizgilerin tam anlamıyla alınmasına ilişkin yukarıdaki tavsiye artık geçerli değildir. Sadece buna ters eğik çizgi ekleyerek bu bir hazır tek tırnak işareti veya ters eğik çizgi içerebilir, ancak kabuk da benzeri (ANSI C karakter kaçar genişletir - Bunun yerine, yine özel hale \n
, bir yeni satır için \t
sekme için ve \xHH
karakteri ile için onaltılı kodHH
). Aksi halde, tek tırnaklı dizeler gibi davranırlar: parametre veya komut ikamesi gerçekleşmez:
echo $'"Thank you. That\'ll be $4.96, please," said the cashier'
Dikkat edilmesi gereken önemli nokta, echo
komutun argümanı olarak alınan tek dizenin tüm bu örneklerde tamamen aynı olmasıdır . Kabuk bir komut satırını ayrıştırdıktan sonra, komutun çalıştırılmasının neyin nasıl aktarıldığını söylemesinin bir yolu yoktur. İsteseydi bile.
repo forall -c ' ...before... '"$variable"' ...after...'