Pojedynczy cytat w podwójnych cudzysłowach i podręcznik referencyjny Bash

18

W sekcji 3.1.2.3, zatytułowanej Podwójne cytaty, instrukcja Bash mówi:

Umieszczanie znaków w podwójnych cudzysłowach („” ”) zachowuje dosłowną wartość wszystkich znaków w cudzysłowach, z wyjątkiem„ $ ”,„ „”, „\”, a gdy włączone jest rozszerzanie historii, „!”.

W tej chwili interesuje mnie pojedynczy cytat ( ').

Jego specjalne znaczenie, opisane w poprzedniej sekcji, sekcja 3.1.2.2, to:

Umieszczanie znaków w pojedynczych cudzysłowach ( ') zachowuje dosłowną wartość każdego znaku w cudzysłowach. Pojedynczy cytat może nie wystąpić między pojedynczymi cudzysłowami, nawet jeśli poprzedzony jest odwrotnym ukośnikiem.

Łącząc dwie ekspozycje,

 echo "'$a'"

gdzie zmienna anie jest zdefiniowana (stąd $a= ciąg zerowy), powinna zostać wydrukowana $ana ekranie, ponieważ ''mając w środku swoje specjalne znaczenie, chroniłaby $przed specjalną interpretacją. Zamiast tego drukuje ''. Dlaczego tak?

Lavya
źródło

Odpowiedzi:

21

'Pojedynczy znak cytat w echoprzykładzie dostaje to wartość literalną (i traci swoje znaczenie), ponieważ zawarty w cudzysłowach ( "). Załączające znaki to podwójne cudzysłowy.

Co możesz zrobić, to wydrukować pojedyncze cytaty osobno:

echo "'"'$a'"'"

lub uciec od $:

echo "'\$a'"
Anthon
źródło
Och, masz całkowitą rację! Wynik jest zgodny z twoją odpowiedzią, ale moje wątpliwości dotyczyły wiersza „Obejmowanie znaków podwójnymi cudzysłowami („ ””) zachowuje dosłowną wartość wszystkich znaków w cudzysłowach, z wyjątkiem „$”, „ ’, ‘\’, and, when history expansion is enabled, ‘!’." in the manual. But now reading it again I realized the second character is not single quote, ("'") but tilde ("”).
Jestem
2
Drugi znak wymieniony w instrukcji to tyknięcie, a nie tylda.
Kenny Evitt,
6

Źle zrozumiałeś dokumentację:

mając w środku swoje specjalne znaczenie, chroniłoby $ przed specjalną interpretacją

„Ma swoje specjalne znaczenie” oznacza, że jest interpretowane specjalnie nie dosłownie. Pojedyncze cudzysłowy uniemożliwiają $rozwinięcie. Ale pojedyncze cudzysłowy w podwójnych cudzysłowach są dosłowne, tzn. Nie wpływają na nic. Jeśli chcesz uzyskać wynik $a, potrzebujesz echo '$a'.

Hauke ​​Laging
źródło
masz rację. Nie tylko źle zrozumiałem dokument, ale też go źle odczytałem (mówiąc „za” „!”). masz rację, że „pojedyncze cudzysłowy w podwójnych cudzysłowach to dosłowne znaki”. Dzięki!
Lavya