Bazen komut bazı metin alıntı bu farklı yollardan tümünü kullanabilir bkz: "..."
, '...'
, $'...'
, ve $"..."
. Neden bu kadar çok farklı türde teklif kullanılıyor?
Farklı davranıyorlar mı veya içlerinde neler yapabileceğimi etkilerler mi?
Bazen komut bazı metin alıntı bu farklı yollardan tümünü kullanabilir bkz: "..."
, '...'
, $'...'
, ve $"..."
. Neden bu kadar çok farklı türde teklif kullanılıyor?
Farklı davranıyorlar mı veya içlerinde neler yapabileceğimi etkilerler mi?
Yanıtlar:
Bunların hepsi farklı bir şey ifade ediyor ve onların içine farklı şeyler yazabilirsiniz (veya aynı şeyleri, farklı anlamlara sahip). Farklı teklif türleri, içlerindeki farklı kaçış dizilerini ( \something
) yorumlar veya değişken enterpolasyonlara ( $something
) ve bunların içindeki diğer genişleme türlerine izin verir veya vermez .
Kısacası:
'...'
tamamen hazır."..."
hem değişkenlere hem de gömülü alıntı karakterlerine izin verir. $'...'
gibi karakterlerden kaçar \n
, ancak değişkenleri genişletmez.$"..."
Bash ve ksh içindeki insan dilindeki çeviriler içindir.Tek tırnaklar arasına yazdığınız her şey kelimenin tam anlamıyla ele alınır ve hiç işlenmez. Ters eğik çizgiler ve dolar işaretlerinin özel bir anlamı yoktur. Bu, bir karakterden ters eğik çizgiden kaçamayacağınız anlamına gelir (diğer tek tırnak işaretleri dahil!), Bir değişkeni enterpolasyon yapamaz veya başka bir kabuk özelliğini kullanamazsınız.
Bu örneklerin tümü kelimenin tam anlamıyla tırnak işaretleri arasında yazılı olanla sonuçlanır:
'hello world' => hello world
'/pkg/bin:$PATH' => /pkg/bin:$PATH
'hello\nworld' => hello\nworld
'`echo abc`' => `echo abc`
'I\'dn\'t've' => I\dn'tve
Sonuncusu karmaşıktır - alıntılanmamış bir metinle birlikte çalışan iki adet tek tırnaklı dizge vardır. Birincisi I\
. Tırnaksız metin , kabuk düzeyindedn\'t
kaçan tek bir alıntı içerir , bu nedenle alıntı bir dize başlatmaz ve değişmez bir karakter olarak eklenir (yani, ). Son alıntı dize sadece . Bunların hepsi, kabuğun çalıştığı gibi, tek bir kelimeyle biraraya gelirler.dn't
ve
Değişmez metin ve değişkenleri birleştirmek için biraz yaygın bir deyim, bunları şu şekilde birlikte çalıştırmaktır:
'let x="'$PATH\"
sonuçlanacak
let x="/usr/bin:/bin"
tek bir kelime olarak ( $PATH
sadece iki durumda daha iyi teklif vermek için daha iyidir - değişken değerindeki boşluklar veya globbing karakterleri başka şekilde işlenebilir) - ancak okunabilir çalışan bir örnek uğruna yapmadım).
İkili tırnak içinde, iki tür genişleme işlenir ve genişlemelerin veya kaçmaların işlenmesini önlemek için karakterlerden kaçmak için ters eğik çizgi kullanabilirsiniz.
Çift tırnak içinde gerçekleşen iki genişleme kategorisi vardır:
$
( parametre genişleme $abc
ve${abc}
, komut ikamesi$(...)
ve aritmetik$((...))
);`abc`
;Tırnak işaretleri içinde ters eğik çizgi, bu işaretlerden önce $
veya sonra koyarak onu genişletebilir `
. Ayrıca, kapanış yapan çift bir alıntıdan da kurtulabilir, bu nedenle \"
yalnızca "
dizginize veya başka bir ters eğik çizgi içerir. Başka bir ters eğik çizgi tam anlamıyla korunur - başka karakterler üretmek için kaçış yoktur ve kaldırılmaz.
Bu örneklerden bazıları öncekinden farklı davranıyor, bazıları ise:
"hello world" => hello world
"/pkg/bin:$PATH" => /pkg/bin:/bin:/usr/bin
"hello\nworld" => hello\nworld
"hello\\nworld" => hello\nworld
"`echo abc`" => abc
"I\'dn\'t've" => I\'dn\'t've
"I'dn't've" => I'dn't've
"I\"dn\"t've" => I"dn"t've
Alıntı Bu tür C tarzı ters eğik çizgi işlenecek kaçar izin verir ama değil değişkenleri veya oyuncu değişikliği gömülü. O var sadece o karakter kaçar destekler alıntı tür .
Bu, şimdi Bash, zsh ve diğer bazı mermilerde desteklenen ksh'nin bir uzantısıdır. Henüz POSIX standardının bir parçası değildir ve bu nedenle en fazla taşınabilir komut dosyaları kullanamaz, ancak bir Bash veya ksh komut dosyası serbesttir.
: Bu kaçar hepsi kendi C anlamları ile birlikte kullanılabilir \a
, \b
, \f
, \n
, \r
, \t
, \v
, ve edebi kaçar \\
, \'
, \"
, ve \?
. Ayrıca uzantıları \e
(kaçış karakteri) ve Bash ve ksh'da \cx
( Ctrl-x tarafından girilenler , örneğin \cM
satır başı) olarak da desteklenirler. Kabuklar kendilerine ait çeşitli küçük uzantılara sahiptir.
Ayrıca, dört tür genel karakter kaçışına da izin verir:
\nnn
, nnn sekizlik değeri olan bir tek bayt\xHH
, onaltılık HH değerine sahip tek bir bayt\uHHHH
Kimin onaltılık endeks Unicode kod noktası olan HHHH\UHHHHHHHH
, onaltılık dizini HHHHHHHH olan Unicode kod noktasıBu rakamların tümü ilkinden sonra isteğe bağlıdır.
$
ve `
hiçbir anlamı yoktur ve kelimenin tam anlamıyla korunur, bu nedenle bir değişken ekleyemezsiniz.
$'hello world' => hello world
$'/pkg/bin:$PATH' => /pkg/bin:$PATH
$'hello\nworld' => hello
world
$'`echo abc`' => `echo abc`
$'I\'dn\'t\'ve' => I'dn't've
$'\U1f574\u263A' => 🕴☺
Bu kaçar çoğu kullanmakta simüle edebilirsiniz komutunu POSIX sadece gerektirir rağmen , , , , , , , , ve orada çalışmak. Bir gömmek için komut ikamesi kullanabilirsiniz gerekirse iç çift tırnak: .printf
\\
\a
\b
\f
\n
\r
\t
\v
\nnn
printf
"Path:$(printf '\t')$PATH"
Bu, doğal dil metin dizelerini yerelleştirmek için ksh ve Bash'e özgü bir uzantıdır ve bir ileti kataloğundaki tırnak içindeki kısmı arar. Önce tüm çift alıntı genişlemelerini yapar. Dize çeviri veritabanında bulunmuyorsa, kendi çevirisi olarak kullanılır. Yerleşik varsayım, dizelerin İngilizce olduğu yönündedir.
Muhtemelen bunu kullanmak istemezsiniz, ancak görürseniz genellikle normal çift tırnak işaretleri olarak kullanabilirsiniz.
Notun bir nedeni, hem gömülü parametre genişlemesine hem de gömülü karakter çıkışlarına izin veren bir tür alıntı olmamasıdır . Bunu isteyeceğiniz çoğu durumda, aşağıdakileri kullanarak daha güvenli olursunuz (daha güvenli) printf
:
printf 'New path: \e[1m%s\e[0m' "/pkg/bin:$PATH:"
Bu, hangi bölümlerin kaçan karaktere tabi olduğunu ve hangi değerlerin veri değerlerini açık bir şekilde ayırır.
Başka alıntı bu stilleri hepsi kabuk içinde bir tek "kelimesi" yaratmak olduğunu olmadıkça $@
veya bir dizi genişleme ${x[@]}
çift tırnak içine kullanılmaktadır. Her iki tekli teklif formu her zaman bir kelimedir ve daha fazla genişletilmemiştir.
$"..."
ayrıca ksh93'den 2.0'da bash'e eklenir.
\cX
içinde zsh
. Öyle \CX
ya da \C-X
orada ( \c
zaten özel bir anlamı var echo
)
'let x="'$PATH\"
dışındaki kabuklarda liste bağlamlarda yanlıştır zsh
olarak $PATH
alıntı değildir (böylece burada istemem + topak bölmek tabi olacaktır).