Bash'ta tek tırnaklı dizgede kesme işaretinden nasıl kaçarsınız?


18

Bash'ın tek tırnaklı dizelerde kesme işareti karakterlerinden kaçmayı nasıl değerlendirdiğini anlamıyorum.

İşte bir örnek:

$ echo ''\''Hello World'\'''
'Hello World' # works

$ echo '\'Hello World\''
 > # expects you to continue input

Ben bunun için açıklamalar aramaya çalıştım ama hiçbir şey alamadım. Bash adlı kullanıcının durumu ne?


echo \''Hello World'\'
matematik

Yanıtlar:


19

Tek tırnak içinde kaçış mümkün değildir. Tek bir alıntıyı tek tırnak içine almanın bir yolu yoktur. Bkz aktaran içinde adam bash .


1
Haklısın. Hile bu satırda 'Bir ters eğik çizgiden önce bile tek tırnak arasında tek bir tırnak oluşmayabilir' Bu yüzden muhtemelen farklı bölümlere ayırır.
Kibet

@Colin Tek bir teklif diğer iki tek tırnak içine alınır (ancak ters eğiktir), alıntı yapılan teklif artık gerçek bir teklif değildir. Sadece özel eşleştirme özellikleri olmayan bir karakterdir.
zero2cx

1
@ zero2cx: Doğru değil:echo '\''
choroba

@ zero2cx: "İç" yerine "dış" diyebilirim.
choroba

3
@choroba değil "tamamen" doğru, bash yapabilirsinizecho $'\'hello world\''
bufh

9

POSIX destekli tek ve çift tırnak işaretine bashek olarak, tırnak içine alınmış bir dizede küçük bir kaçan karakter sınıfına (tek tırnak dahil) izin vermek için ek bir tırnak türü sağlar:

$ echo $'\'Hello World\''
'Hello World'

Bölümün bashsonuna yakın , kılavuz sayfasındaki TEKLİF VERME bölümüne bakın. ("ANSI C" yi arayın.)


3

Kaçan kesme işaretlerinizle neler olduğunu açıklamak için ikinci örneğinizi inceleyeceğiz (ayrıca tek tırnak işaretleri veya güçlü tırnak işaretleri de göreceğiz ):

$ echo '\'Hello World\''
>     # expects you to continue input

Burada, belirttiğiniz gibi teklifi asılı bıraktınız. Şimdi ucu kesin ve şu şekilde değiştirin:

                     v                                v           v
$ echo '\'Hello World     # Echo two strings: '\' and 'Hello World'.
\Hello World         ^

"Merhaba Dünya" alt dizesi burada alıntılanmamıştır, ancak güçlü alıntılanmış gibi davranmıştır . Örneğinizi tekrar kullanarak, bu sefer ucu farklı şekilde kırpın:

                     vv                                    v (plain apostrophe)
$ echo '\'Hello World\'   # Will echo: '\' and 'Hello World''
\Hello World'        ^^   # Note that the trailing ' char is backslash escaped. 

"Merhaba Dünya" alt dizgisi yine güçlü alıntılanmış gibi davranır, sonunda yalnızca ek kesme işareti (kaçtı, artık tek bir alıntı yok).

Sonuna başka bir tek tırnak eklendiğinde (orijinal örneğiniz) dize asılı kalır ve yakın bir alıntı bekler.


3

Kabuktan alıntılardan basit bir örnek:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

Zaten açılmış olanı ( ') kapatarak , \'yazdırmak için kaçan bir ( ) yerleştirip başka bir tane ( ') açarak yapılır .

Alternatif:

$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc

Zaten açılmış bir ( ') öğesini bitirip , başka bir alıntıya ( "'") alıntı yaparak , ardından başka bir alıntıyı ( ) açarak yapılır '.

Yaptığınız ( '\'Hello World\'') ,:

  1. 1 kesme işareti açıldı: '.
  2. Hemen ardından kapatılır \', böylece dize: olur '\'.
  3. Hello World tırnak işaretleri değildir.
  4. Tek başına kesme işareti ( \') açmadan yerleştirilir.
  5. Son kesme işareti (' ) dize açıyor, ancak beklenen kapanış dizesi yok.

Yani doğru örnek:

$ echo \'Hello World\'
'Hello World'

İlgili: Tek tırnaklı dizelerde tek tırnaklardan nasıl kaçılır?

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.