Özel karakterleri kabuğa sarmak için tekli alıntı kullanırken 'tek alıntı' nasıl yankı verilir?


26

Bugün http://www.tutorialspoint.com/unix/unix-quoting-mechanisms.htm adresinden kabuk öğretici okuyorum

İçinde bahsettiği:

Çıktılan bir dizgenin içinde tek bir alıntı belirirse, dizginin tamamını tek bir tırnak içine koymamalısınız, bunun yerine bir ters eğik çizgi () kullanmanın önceliğini aşağıdaki gibi yapmalısınız:

echo 'It\'s Shell Programming'

Bunu centos sunucumda denedim, işe yaramadı, >daha fazla yazmamı istediğimi sorar.

Ben iki tek tırnak kaçış sembolü içeren normal karakterler, içine her özel karakterler dönüştürmek beri merak \, kendisini, ancak hariç ',
nasıl tek tek alıntı temsil etmelidir 'tek alıntılanan ifadesinde?


1
Neden kullanmayın echo It\'s Shell Programmingveya echo "It's Shell Programming"?
cuonglm

@ cuonglm, çünkü şu ifadeyi kullanabilirimecho Wow, I'm going to have lots of $$$$$$ now
Zen

2
Bu yüzden çift tırnak kullanmalı ve kaçmalısınız $. Gibi bir şey echo Wow, I\'m going to have lots of \$\$\$\$\$\$ nowya da sadeceecho Wow, I\'m going to have lots of '$$$$$$' now
cuonglm

@cuonglm, evet, yapabilirim ve nasıl yapabileceğimi biliyorum. Ancak okuduğum ders, tek tırnaklı ifadelerin içinde tek bir alıntıdan kaçmanın bir yolu olduğu konusunda emin görünüyor, ancak eğitimin verilen örneği işe yaramıyor. Bu yüzden birisinin çözümü bildiğini merak ediyorum.
Zen

1
Buna ne dersin? echo 'It'"'"'s Shell Programming'. Ben sadece onu üç satır olarak böldüm, ilk ve son tek tırnak işaretleriyle çevrilmiş, ancak ortadaki çift tırnak işaretleriyle çevrilmiş tek bir alıntı var.
jcbermu

Yanıtlar:


49

Öğretici yanlıştır.

POSIX diyor ki:

Tek tırnak içinde tek bir alıntı yapılamaz.

İşte bazı alternatifler:

echo $'It\'s Shell Programming'  # ksh, bash, and zsh only, does not expand variables
echo "It's Shell Programming"   # all shells, expands variables
echo 'It'\''s Shell Programming' # all shells, single quote is outside the quotes
echo 'It'"'"'s Shell Programming' # all shells, single quote is inside double quotes

Daha fazla okuma: Alıntılar - Greg's Wiki


4
Bir tane daha: echo 'It''s Shell Programming'- rc_quotesseçenek kümesiyle zsh (ve rc kabuğu da) - tek tırnak içinde bir çift tırnak işareti, tek bir tek alıntıyı temsil eder.
Michał Politowski

5
Bazen kullanmak q="'"ve qq='"'bu temiz hale getirme. Bu daha sonra izin verir echo "It${q}s ${qq}Shell Programming${qq}"(takip eden harfler verilen küme parantezleri gerekir). POSIX güvenli. Dış katman çift alıntı yapılmalıdır.
Adam Katz

1

Kullanabilirsiniz:

sed "s/'"'/&\\&&/g
     s/.*/'"'&'"'/
' <<IN
$arbitrary_value
IN

Güvenli bir şekilde kabuklamak için satır başına bir değer satırı verin.

Kabuk bağlı olarak, yapmak için seçenek de olabilir:

printf %q\\n "$arbitrary_value"

Genelde yapmayı tercih etmeme rağmen:

a=$(alias "a=$arbitrary_value" a); a=${a#*=}

Daha manuel bir yaklaşım şöyle görünebilir:

sq(){ set \' "$1"
      while case $2 in (*\'*) :;;
      (*) ! RETURN="$1$2'"     ;;esac
      do  set "$1${2%%\'*}'\''" "${2#*\'}"
      done
}

... en azından çatalsız.


1
Ne hakkında konuştuğunuz hakkında hiçbir fikrim yok, ifadesi dışında printf %q\\n "$arbitrary_value"diğerleri çok karmaşık.
Zen

1

Birinin dosyaya tek ve çift tırnaklı bir karışım getirmesi için bir araya gelmesi durumunda, bu da işe yarar:

cat > its-shell-programing.txt << __EOF__
echo $'It\'s Shell Programming'
echo "It's Shell Programming"
echo 'It'\''s Shell Programming'
echo 'It'"'"'s Shell Programming'
__EOF__

Kabuğun bir değişken olarak görebileceği her şey ters eğik çizgiden kaçmış olsa da:

cat >> its-shell-programing.txt << __EOF__
echo \$It\'s Shell Programming
__EOF__
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.