Szukaj…


Składnia

  • \ C (dowolny znak oprócz nowej linii)
  • „wszystkie dosłowne, z wyjątkiem pojedynczych cudzysłowów”; „this:„ \ ”to pojedynczy cytat”
  • $ „tylko \\ i \” są wyjątkowe; \ n = nowa linia itp. ”
  • „$ zmienna i inny tekst; \” \\\ $ \ `są wyjątkowe”

Nowe linie i znaki kontrolne

Znak nowej linii może być zawarty w ciągu pojedynczego lub podwójnego cudzysłowu. Zauważ, że ukośnik-nowa linia nie powoduje nowej linii, podział linii jest ignorowany.

newline1='
'
newline2="
"
newline3=$'\n'
empty=\

echo "Line${newline1}break"
echo "Line${newline2}break"
echo "Line${newline3}break"
echo "No line break${empty} here"

W ciągach znaków dolara można wstawiać znaki sterujące, podobnie jak w wielu innych językach programowania, odwrotną literą ukośnika lub odwrotną kreską ósemkową.

echo $'Tab: [\t]'
echo $'Tab again: [\009]'
echo $'Form feed: [\f]'
echo $'Line\nbreak'

Podwójne cudzysłowy w przypadku podstawiania zmiennych i poleceń

Zmienne podstawienia należy stosować tylko w podwójnych cudzysłowach.

calculation='2 * 3'
echo "$calculation"         # prints 2 * 3
echo $calculation           # prints 2, the list of files in the current directory, and 3
echo "$(($calculation))"    # prints 6

Poza podwójnymi cudzysłowami $var przyjmuje wartość var , dzieli ją na części rozdzielane spacjami i interpretuje każdą część jako wzór globalny (symbol wieloznaczny). O ile nie chcesz tego zachowania, zawsze umieszczaj $var wewnątrz podwójnych cudzysłowów: "$var" .

To samo dotyczy podstawień poleceń: "$(mycommand)" jest wynikiem mycommand , $(mycommand) jest wynikiem split + glob na wyjściu.

echo "$var"             # good
echo "$(mycommand)"     # good 
another=$var            # also works, assignment is implicitly double-quoted
make -D THING=$var      # BAD! This is not a bash assignment.
make -D THING="$var"    # good
make -D "THING=$var"    # also good

Podstawienia poleceń mają swoje własne konteksty cytowania. Pisanie podstawienia dowolnie zagnieżdżonych jest łatwe, ponieważ parser będzie śledzić głębokość zagnieżdżenia zamiast chciwie szukając pierwszego " postać StackOverflow składnia wyróżnienia analizuje to źle, jednak np..:

echo "formatted text: $(printf "a + b = %04d" "${c}")" # “formatted text: a + b = 0000”

Zmienne argumenty do podstawienia polecenia powinny być także podwójnie cytowane w rozszerzeniach:

echo "$(mycommand "$arg1" "$arg2")"

Cytując dosłowny tekst

Wszystkie przykłady w tym akapicie drukują wiersz

!"#$&'()*;<=>?  @[\]^`{|}~

Ukośnik odwrotny cytuje następny znak, tzn. Następny znak jest interpretowany dosłownie. Jedynym wyjątkiem jest nowa linia: odwrotny ukośnik-nowa linia rozwija się do pustego ciągu.

echo \!\"\#\$\&\'\(\)\*\;\<\=\>\?\ \ \@\[\\\]\^\`\{\|\}\~

Cały tekst pomiędzy apostrofami (cytaty forward ' , znany również jako apostrofu) jest drukowany dosłownie. Nawet odwrotny ukośnik oznacza sam siebie i nie można podać ani jednego cytatu; zamiast tego możesz zatrzymać literał ciąg, dołączyć dosłowny pojedynczy cudzysłów z odwrotnym ukośnikiem i ponownie zacząć literał ciąg. W ten sposób czteroznakowa sekwencja '\'' skutecznie pozwala zawrzeć pojedynczy cytat w dosłownym ciągu.

echo '!"#$&'\''()*;<=>?  @[\]^`{|}~'
#          ^^^^

Pojedynczy cudzysłów w dolarach rozpoczyna dosłowny ciąg $'…' podobnie jak wiele innych języków programowania, gdzie odwrotny ukośnik cytuje następny znak.

echo $'!"#$&\'()*;<=>?  @[\\]^`{|}~'
#           ^^            ^^

Podwójne cudzysłowy " ograniczają półliteralne ciągi znaków, w których tylko znaki " \ $ i ` zachowują swoje specjalne znaczenie. Znaki te potrzebują przed nimi odwrotnego ukośnika (zwróć uwagę, że jeśli po odwrotnym ukośniku występuje jakiś inny znak, odwrotny pozostaje). Podwójne cudzysłowy są najbardziej przydatne, gdy zawierają zmienną lub podstawienie polecenia.

echo "!\"#\$&'()*;<=>?  @[\\]^\`{|}~"
#      ^^                 ^^  ^^
echo "!\"#\$&'()*;<=>?  @[\]^\`{|}~"
#      ^^                 ^  ^^      \[ prints \[

Interaktywnie, strzeż się tego ! uruchamia ekspansję historii w podwójnych cudzysłowach: "!oops" szuka starszego polecenia zawierającego oops ; "\!oops" nie rozwija historii, ale zachowuje odwrotny ukośnik. Nie dzieje się tak w skryptach.

Różnica między podwójnym cytatem a pojedynczym cytatem

Cudzysłów Pojedynczy cytat
Umożliwia zmienną ekspansję Zapobiega zmiennej ekspansji
Umożliwia rozszerzanie historii, jeśli jest włączona Zapobiega rozszerzaniu historii
Umożliwia zastępowanie poleceń Zapobiega zastępowaniu poleceń
* i @ mogą mieć specjalne znaczenie * i @ są zawsze dosłowne
Może zawierać zarówno pojedynczy cytat, jak i podwójny cytat Pojedynczy cytat nie jest dozwolony w pojedynczym cytacie
$ , ` , " , \ można usunąć znakiem \ aby zapobiec ich specjalnemu znaczeniu Wszystkie są dosłowne

Właściwości wspólne dla obu:

  • Zapobiega globowaniu
  • Zapobiega dzieleniu słów

Przykłady:

$ echo "!cat"
echo "cat file"
cat file
$ echo '!cat'
!cat
echo "\"'\""
"'"
$ a='var'
$ echo '$a'
$a
$ echo "$a"
var


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow