Bu çok fazla kabuğa bağlıdır. Ayrıntılar için kabuk kılavuzunuza bakın.
Ayrıca bazı karakterlerin yalnızca bazı bağlamlarda özel olduğunu unutmayın. Örneğin, çoğu kabukta *
ve ?
yalnızca liste bağlamlarında, POSIX veya csh benzeri kabuklarda ~
özeldir, yalnızca bir sözcüğün başında veya gibi bazı karakterleri takip eder :
. İçin aynı =
yer zsh
. Bazı mermilerde, [
sadece a ile eşleştirildiğinde (bazı kısıtlamalarla) özeldir ]
.
bash
Veya gibi bazı kabuklarda yash
, boş belirteç sınırlayıcılar gibi özel karakterler de yerel ayara göre değişir.
Alıntılama operatörleri (bu karakterlerin özel anlamını kaldırmak için) kabuklar arasında büyük farklılıklar gösterir.
Bourne benzeri kabuklar
Bourne benzeri kabuklar için bir özet ( sh
80'lerden beri bazı sistemlerde veya başka bir sistemde çağrıldığı bilinen kabuklar ):
Bourne kabuğu
Özel karakterler:
"\'&|;()^`<>$
, boşluk, satırsonu ve sekme, alıntılanmadığında basit komut satırlarında özeldir.
#
(erken sürüm hariç) bir satırın başında veya tırnaksız bir boşluk, sekme veya sonrasında özeldir &|()^<>;`
.
{
ve }
yalnızca kabuk anahtar kelimeler oldukları için özeldir (yalnızca komut konumundaki kelimeler).
*?[
globbing operatörleri olarak özeldir, bu yüzden sadece liste bağlamında. Durumunda [
, bu kadar [...]
yani globbing operatörüdür ya [
ya ]
sadece özel bir anlamı çıkarmak için alıntı gerekmektedir.
=
bir atama operatörü olarak işlem gördüğü bağlamlarda özeldir. Yani, basit bir komutta, bir argümanı takip etmeyen tüm kelimeler için (sonra hariç set -k
).
Alıntılama operatörleri
\
yeni satır dışındaki tüm özel karakterleri tırnak içine alır ( sonraki fiziksel satıra \<newline>
uzun bir mantıksal satır devam etmenin bir yoludur , böylece sıra kaldırılır). Backtick'lerin kendi içlerinde olduğu gibi ekstra karmaşıklık eklediğini, ilk olarak kapanış backtick'ten kaçmak ve ayrıştırıcıya yardımcı olmak için kullanıldığını unutmayın. Çift tırnak içinde, sadece kendini kaçmak için kullanılabilir, , ve ( yine bir satır devam is). Burada bir belgenin içinde, bunun dışında . buradaki belgelerdeki karakterlerden kaçmanın tek yoludur.\
\
"
$
`
\<newline>
"
\
"..."
Çift tırnak tüm karakterlerden kurtulmak ancak kendisi \
, $
ve `
.
'...'
tek tırnak işaretleri kendisi hariç tüm karakterlerden kaçar.
POSIX mermileri
POSIX mermileri çoğunlukla Bourne kabuğu gibi davranırlar, ancak:
^
artık özel bir karakter değil
~
olduğu bazı bağlamlarda özel
{
özel olmasına izin verilir, bu yüzden alıntılanmalıdır.
ksh
POSIX gibi:
{string}
dize tırnaksız ,
(veya ..
bazı durumlarda ve bazı sürümlerde) içeriyorsa özeldir .
- ksh93'ün ek bir özel fiyatlandırma operatörü vardır:
$'...'
karmaşık kurallarla. Bu operatör (bazı varyasyonlar ile birlikte) bulunur bash
, zsh
, mksh
ve FreeBSD ve BusyBox sh
.
ksh93
dizenin yerelleştirmeye tabi olması dışında $"..."
çalışan bir alıntı operatörü de vardır "..."
(kullanıcının diline çevirecek şekilde yapılandırılabilir). mksh
yok sayar $
in $"..."
.
bash
gibi ksh93
ama:
- tek baytlık karakter yerel ayarlarında, tüm boş (yerel ayara göre) karakterler sınırlayıcı (boşluk veya sekme gibi) olarak kabul edilir. Aslında, bu, bazı yerel ayarlarda boş bir karakter olması durumunda tüm baytları 8. bitle ayarlamanız gerektiği anlamına gelir.
- Etkileşimli durumlarda olduğu gibi csh geçmiş genişlemesi etkinleştirildiğinde
!
, bazı bağlamlarda özeldir ve çift tırnak her zaman kaçmaz. Ve ^
bir komutun başında özeldir.
zsh
gibi ksh93
ama:
bash
csh geçmişi genişlemesi ile aynı not
=
bir kelimenin ilk karakteri olarak özeldir ( =ls
genişler /bin/ls
).
{
ve }
(olduğu gibi sınırlandırılmış değilken de açıp kapama komutu grupları olabilir {echo text}
Bourne gibi eserleri { echo text;}
).
[
tek başına hariç , [
a ile kapalı olmasa bile alıntılanması gerekir ]
.
- İle
extendedglob
seçeneği etkin, #
, ^
ve ~
operatörler globbing edilmektedir.
- İle
braceccl
seçeneği, {non-empty-string}
özeldir.
$"..."
desteklenmiyor.
- özel bir tuhaflık olarak, bir sözcüğün başlangıcında ( iş belirtimine izin vermek için) (tırnak içine alınmış veya genişletilmiş) izlenirken özel
?
değildir.%
%?name
- bir
rcquotes
seçenek (varsayılan olarak etkin değildir), tek tırnak ''
içine alınabilir rc
(aşağıya bakınız).
yash
gibi POSIX
o hariç.
- tüm boş karakterler sınırlayıcı olarak kabul edilir.
- İle
brace-expand
seçeneği, uygular zsh-tarzı şortlar genişleme.
Tüm kabuklar için, alıntılamanın farklı çalıştığı bazı özel bağlamlar vardır. Burada zaten belgelerden ve backticklerden bahsettik, ama aynı zamanda [[...]]
ksh ve birkaç başka kabuk, POSIX $((...))
, case
konstrüksiyon var ...
Ayrıca, alıntılar, genişletmeler (çift tırnak işaretleri ile) söz konusu olduğunda veya burada belge sınırlayıcılarına uygulandığında başka yan etkilere sahip olabileceğini unutmayın. Ayrılmış sözcükleri de devre dışı bırakır ve takma ad genişletmeyi etkiler.
özet
Bourne benzeri kabuklarda, !#$^&*?[(){}<>~;'"`\|=
SPC, TAB, NEWLINE ve 8. bit setine sahip bazı baytlar özeldir veya olabilir (en azından bazı bağlamlarda).
Özel anlamı tam anlamıyla ele alınacak şekilde kaldırmak için tırnak işareti kullanırsınız.
kullanın:
'...'
her karakterin özel anlamını kaldırmak için:
printf '%s\n' '\/\/ Those $quoted$ strings are passed literally as
single arguments (without the enclosing quotes) to `printf`'
\
yalnızca bir karakterin özel anlamını kaldırmak için:
printf '<%s>\n' foo bar\ baz #comment
Yukarıda, yalnızca a'nın önünde yer alan boşluk karakteri \
tam anlamıyla iletilir printf
. Diğerleri kabuk tarafından jeton sınırlayıcılar olarak ele alınır.
- kullanmak
"..."
hala parametre genişletme izin verirken karakterleri alıntı ( $var
, $#
, ${foo#bar}
...), aritmetik genişleme ( $((1+1))
ayrıca $[1+1]
bazı kabuklarda) ve komut ikamesi ( $(...)
veya eski formunda `...`
. Aslında çoğu zaman, sen do içeride olanlar genişletmeleri koymak istiyorum her durumda çift tırnak . kullanabilirsiniz \
dahilinde "..."
özel hala özeldir karakterlerin anlamlarını (ama sadece onları) kaldırın.
dize içeriyorsa '
karakteri, hala kullanabilirsiniz '...'
kalanı için ve alıntı diğer alıntı mekanizmalarını kullanmak '
gibi "'"
veya \'
veya (varsa) $'\''
:
echo 'This is "tricky", isn'\''t it?'
Modern $(...)
komut değiştirme biçimini kullanın . Eskiyi yalnızca `...`
Bourne kabuğuyla uyumluluk için, yani çok eski bir sistemle ve yalnızca değişken atamalarda kullanın, çünkü kullanmayın:
echo "`echo "foo bar"`"
Bu, Bourne kabuğu veya ksh'ın AT&T sürümleriyle çalışmaz. Veya:
echo "`echo \"foo bar\"`"
Bourne ve AT&T ksh ile çalışır, ancak ile çalışmaz yash
, ancak şunları kullanır:
var=`echo "foo bar"`; echo "$var"
ki hepsi ile çalışacak.
Onları portatif olarak çift tırnak işareti ile yerleştirmek de imkansızdır, bu yüzden değişkenleri tekrar kullanın. Ayrıca özel ters eğik çizgi işlemine dikkat edin:
var=`printf '%s\n' '\\'`
İçeride sadece bir ters eğik çizgi depolayacaktır $var
, çünkü backticks içinde ekstra bir ters eğik çizgi işleme seviyesi ( \
, `` ve $
(ve "
dışında da alıntı yapıldığında yash
)) olduğundan,
var=`printf '%s\n' '\\\\'`
veya
var=`printf '%s\n' '\\\'
yerine.
Csh ailesi
csh ve tcsh, belirgin bir şekilde farklı bir sözdizimine sahiptir, ancak Bourne kabuğuyla ortak bir mirası paylaştıkları için hala çok ortak noktası vardır.
Özel karakterler:
"\'&|;()^`<>$
, boşluk, yeni satır ve sekme alıntı yapılmadığında her yerde özeldir.
#
(csh, #
yorum lideri olarak tanıtılan kabuktur ) bir komut dosyasının başlangıcında veya alıntı yapılmayan bir alan, sekme veya yeni satırın ardından özeldir.
*?[
globbing operatörleri olarak özeldir, bu yüzden liste bağlamında
{non-empty-string}
özeldir (csh, küme ayracı genişlemesini başlatan kabuktur).
!
ve ^
tarih genişlemesinin bir parçası olarak özeldir (yine bir csh buluşu) ve alıntı kuralları özeldir.
~
(tilde genişleme ayrıca bir csh buluşu) bazı bağlamlarda özeldir.
Alıntılama operatörleri
Bourne kabuğuyla aynıdır, ancak davranış farklıdır. tcsh sözdizimi açısından csh gibi davranır, csh'nin birçok versiyonunun kötü hatalara sahip olduğunu göreceksiniz. Kabaca çalışan bir csh sürümü elde etmek için en son tcsh sürümünü edinin.
\
satırsonu dışında tek bir karakterden kaçar (Bourne kabuğunda olduğu gibi). Kaçabilecek tek teklif operatörü !
. \<newline>
kaçmaz ama komut ayırıcısından bir token ayırıcısına (boşluk gibi) dönüştürür
"..."
kendisi dışındaki tüm karakterleri kaçar $
, `
, yeni satır ve !
. Bourne kabuğunun aksine, \
kaçmak $
ve `
içeride kullanmak için kullanamazsınız "..."
, ancak \
kaçmak !
veya satırsonu için kullanabilirsiniz (ancak bir satırdan veya satır satırından önce hariç !
). Bir hazır !
olan "\!"
ve bir hazır \!
olan "\\!"
.
'...'
kendisi !
ve yeni satır dışındaki tüm karakterlerden kaçar . Çift tırnaklar için olduğu gibi, !
newline ters eğik çizgi ile kaçabilir.
- komut ikamesi sadece
`...`
sözdizimi ile yapılır ve güvenilir bir şekilde kullanılamaz.
- değişken ikame de oldukça kötü tasarlanmış ve hata eğilimli. Bir
$var:q
operatör, değişkenleri içeren daha güvenilir kod yazmaya yardımcı olur.
özet
Mümkünse csh'dan uzak durun. Kullanamıyorsanız:
- çoğu karakter alıntı için tek tırnak.
!
ve yeni satırın hala bir \
.
\
çoğu karakterden kaçabilir
"..."
içinde bazı genişletmelere izin verebilir, ancak yeni satır ve / veya ters eğik çizgi karakterleri gömerlerse oldukça hatalıdır, en iyisi sadece tek tırnak kullanmak ve $var:q
değişken genişletme için olabilir. Bir dizinin öğelerini güvenilir bir şekilde birleştirmek istiyorsanız döngüler kullanmanız gerekir.
rc
aile
rc
bir plan9
kabuk ve bunun soyundan gelenlerde gibi es
ve akanga
Unix ve Unix sever için taşınır. Bu, daha temiz ve daha iyi bir sözdizimine sahip bir kabuk ve geri uyumluluk için Bourne benzeri kabuklarla sıkışmasaydık herkesin kullanacağı bir kabuk.
rc
/akanga
Özel karakterler
#;&|^$=`'{}()<>
, SPC, TAB ve NEWLINE, alıntılanmadığında her zaman özeldir.
*?[
globbing operatörleri.
Teklif operatörü
'...'
tek teklif operatörüdür. Okuryazar '
, ''
tek tırnak içinde şu şekilde yazılır :
echo 'it''s so simple isn''t it?'
es
es
dayalı bir deneysel kabuk olarak görülebilir rc
.
Yine de birkaç farklılığı var. Bu Q / A için ilgi çekici olan \
, aynı zamanda bir tırnak operatörü olması (yeni satır dışındaki tüm özel karakterleri tırnak içine alır) ve ayrıca \n
satır sonu için yeni satır gibi kaçış dizilerini tanıtmak için de kullanılabilir \b
...
balık
balık göreceli yeni bir kişidir (yaklaşık 2005), öncelikle interaktif kullanım için tasarlanmıştır ve diğer kabuklardan önemli ölçüde farklı bir sözdizimine sahiptir.
özel karakterler
"'\()$%{}^<>;&|
Alıntılanmadığında her zaman özel ( %
diğer kabuklardan önemli bir fark olarak (pid genleşmesi için) not edin ve `
özel değildir)
#
(yorum) alıntılanmamış alanı, sekmeyi, yeni satırı veya ;&|^<>
*?
(ama değil [...]
) globlama operatörleri
Alıntılama operatörleri
\
yeni satır hariç tek bir özel karakterden alıntı yapar, ancak C kaçış dizisi ( \n
, \b
...) tanıtıcısı olarak da iki katına çıkmasına dikkat edin . IOW, \n
bir alıntı n
değil, bir satırsonu.
"..."
kendisi dışında her şeyi tırnak içine alır $
ve ters eğik çizgi ve ters eğik çizgi bunlardan kaçmak için kullanılabilir. \<newline>
içeride bir çizgi devam (kaldırıldı) "..."
.
'...'
kendisi dışında her şeyi tırnak ve \
ve bunları kaçmak için ters eğik çizgi kullanabilirsiniz.
=
,@
Ve%
bazı bağlamlarda bazı kabuklarda özeldir.