Özel bir karakter normal karakter olarak nasıl kullanılır?


13

'Çift tırnak işareti (") nasıl yazılır?' isteniyor, ve biz aynı cevabı (olarak yazın ile toplumumuzu yığılmayı istemiyoruz \"içine değilse ', s "içine eğer 's.) Yani, soru burada.

Normal gibi bir terminale özel karakter yazamazsınız, örneğin bu komut başarısız olur:

echo Updates (11)

Peki, terminaldeki bu karakterleri normalmiş gibi nasıl yazabilirim?

!#$^&*?[](){}<>~;'"\|<space><tab><newline>

Taşıma-dönüşün nerede özel olduğunu bildiğim Unix kabuğu yok . =, @Ve %bazı bağlamlarda bazı kabuklarda özeldir.
Stéphane Chazelas

@ StéphaneChazelas Umm ... satır başı ^M( ^J) bana satır besleme ( ) gibi davranıyor (Ubuntu 14.04, sh).
EKons

Hayır, terminal sürücünüz girişe dönüşür ^M, ^Jancak ^Mkabuğa özel değildir ve alıntılanması gerekmez. Yazın echo ^V^M | hdve 0d karakter (ve yankı tarafından eklenen 0A) göreceksiniz.
Stéphane Chazelas

@ StéphaneChazelas Umm ... Ne olduğunu bilmiyorum hd, belki xxdonaltılık bir izleyici olarak daha iyidir.
EKons

Hangisi. Elinizde yoksa POSIX od -tx1veya sed -n lvim'in xxd'sini kullanın hd. Bazı sistemlerde ayrıca cat -vteveyacat -A
Stéphane Chazelas

Yanıtlar:


27

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 ].

bashVeya 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 ( sh80'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, mkshve FreeBSD ve BusyBox sh.
  • ksh93dizenin 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). mkshyok sayar $in $"...".

bash

gibi ksh93ama:

  • 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 ksh93ama:

  • bashcsh geçmişi genişlemesi ile aynı not
  • =bir kelimenin ilk karakteri olarak özeldir ( =lsgeniş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 extendedglobseçeneği etkin, #, ^ve ~operatörler globbing edilmektedir.
  • İle bracecclseç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 rcquotesseçenek (varsayılan olarak etkin değildir), tek tırnak ''içine alınabilir rc(aşağıya bakınız).

yash

gibi POSIXo hariç.

  • tüm boş karakterler sınırlayıcı olarak kabul edilir.
  • İle brace-expandseç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 $((...)), casekonstrü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:qoperatö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:qdeğ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

rcbir plan9kabuk ve bunun soyundan gelenlerde gibi esve akangaUnix 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

esdayalı 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 \nsatı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, \nbir alıntı ndeğ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.

(Bu yüzden bütün bağlamlarda sadece onlar special dahil ettik caynı davranır \c, cçıktıyı değil c: command not foundvb STDERR üzerine) Ve bahsediyorum shburada. Ayrıca, bunun bir "temizlik" sorusu olduğunu unutmayın, yani tüm bu karakterleri kapsayacak şekilde buradadır, bu nedenle 19'dan fazla sorunun sorulması gerekmez. Soru, bu tür farklı karakterler için farklı sorular sorulduğu bir olay sayesinde gönderildi, kesinlikle burada temizlemek istiyoruz!
EKons

Eh, ?[operatörler globbing, ancak tüm bağlamlarda özel değil, ama *öyle görünüyor, çünkü geçerli dizinin içeriğini echo *kötü bir şekilde echoesiyor (hiçbir şeyden kaçmıyor). echo ?bir değişmezi yankılar ?ve echo [bir değişmezi yankılar [. Ayrıca, ]bir globbing oberator da.
EKons

1
@ ΈρικΚωνσταντόπουλος, *bir glob olarak gizli olmayan tüm dosyalara, gizli ?olmayan tek karakterli dosyalara, [a-z]adı a ve z arasında tek bir karakter olan dosyalara genişler . Kabuğa bağlı olarak herhangi bir dosyayla (sizin durumunuzda olduğu gibi ?) eşleşmediklerinde, eşleşmeme hatası alırsınız veya desen kendi kendine genişler. Her durumda, hatta kendilerine genişletmek kabuk üzerindeki, onlar durumda alıntı gerek olabilir bir dosya maç.
Stéphane Chazelas

Ancak, bir glob olarak değil, *hala bir şeye genişler.
EKons

ΈρικΚωνσταντόπουλος @, *gibi ?o (durumu için aynı değilse, *yalnızca, geçerli dizindeki dosyaları var gizli olduğunda var yalnız, a*adı başlar ile hiçbir dosya var ki yıllardan a, ya genişleyeceği için ...) kendisi (çoğu Bourne gibi kabuklarına) veya no-maç hatası (yükseltir csh, tcsh, fish, (uyarı) zsh, bash -O failglobbaşka bir desen var, (veya genişlediğinde bazı kabuklarından veya eğer nullglob seçeneğiyle hiçbir şey, erken Unix kabukları) genişlediğinde bu csh, tcsh, zsh -o cshnullglob, erken unix kabuklarında bir şey).
Stéphane Chazelas

4

1. Kaçış

Aşağıdaki gibi tüm bu karakterlerden bir kaçış yapın \(yeni satırlarda / satır başlarında çalışmaz):

$ echo Use a \"\\\" symbol to escape characters.
Use a "\" symbol to escape characters.

2. Çift teklif

Metnin tamamını şu şekilde "s içine alın :

$ var=variables;echo "Enclose text in \"s. You can also use $var in them. `echo Surprise!!!`"
Enclose text in "s. You can also use variables in them. Surprise!!!

3. Tek teklif

Çift tırnak işareti ile aynıdır, ancak özel bir jeton yoktur.

$ proof=proveit;echo 'This should not read "proveit": $proof'
This should not read "proveit": $proof

1
fishTek bir alıntı her karakteri tırnak içine alan Bourne benzeri kabukları değil , kabuğun davranışını tarif ediyorsunuz (ters eğik çizgi özel değil '...'). İçinde olduğunu unutmayın fish, %ayrıca özel bir karakterdir.
Stéphane Chazelas

Nasıl StéphaneChazelas @ bilmiyorum fishçalışır, ancak benim deneyim içinde, yani sh, echo '\\'yankıları \ ve echo '\''yankıları '.
EKons

1
echo '\\'çıkışlar \ senin yüzünden echogenişlediğinde ANSI C dizileri kaçış (bazı echouygulamalar gerek echo -e '\\'bunun için). printf '%s\n' '\\'çıktılar \\.
Stéphane Chazelas

shBelirli bir mermiyi tanımlamayan, denilen çok sayıda farklı ve genellikle uyumsuz mermi olduğunu ve var olduğunu unutmayın sh.
Stéphane Chazelas

@ StéphaneChazelas Oh tamam, şimdi değiştireceğim. Bu arada, \'tek tırnaklı bir karakter dizisinin içinde özel bir belirteç var mı?
EKons
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.