Bash
Cytowanie
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