To bardzo zależy od powłoki. Sprawdź szczegóły w instrukcji obsługi powłoki.
Pamiętaj też, że niektóre postacie są wyjątkowe tylko w niektórych kontekstach. Na przykład w większości powłok *
i ?
są one wyjątkowe tylko w kontekście list, w powłokach POSIX lub podobnych do csh, ~
są wyjątkowe tylko na początku słowa lub po niektórych znakach, takich jak :
. To samo dotyczy =
w zsh
. W niektórych powłokach [
jest wyjątkowy tylko wtedy, gdy jest dopasowany (z pewnymi ograniczeniami) przez ]
.
W niektórych powłokach, takich jak bash
lub yash
, znaki specjalne, takie jak puste ograniczniki tokenów, również różnią się w zależności od regionu.
Operatory cytowania (w celu usunięcia specjalnego znaczenia tych znaków) również różnią się znacznie między powłokami.
Muszle Bourne'a
Podsumowanie dla powłok podobnych do Bourne'a (tj. Powłok, o których wiadomo, że są wywoływane sh
w tym lub innym systemie od lat 80.):
Skorupa Bourne'a
Znaki specjalne:
"\'&|;()^`<>$
, spacja, nowa linia i tabulator są wyjątkowe w prostych wierszach poleceń, gdy nie są cytowane.
#
(z wyjątkiem wczesnej wersji) jest wyjątkowy na początku wiersza lub po cudzysłowie, tabulacji lub &|()^<>;`
.
{
i }
są wyjątkowe tylko dlatego, że są słowami kluczowymi powłoki (więc tylko słowa w pozycji poleceń).
*?[
są wyjątkowe jako operatory globowania, więc tylko w kontekście listowym. W przypadku [
, [...]
jest to operator globowania, albo należy [
albo ]
cytować, aby usunąć specjalne znaczenie.
=
jest wyjątkowy, gdy jest traktowany jako operator przypisania. To jest, w prostym poleceniu, dla wszystkich słów, które nie następują po argumencie (oprócz po set -k
).
Cytowanie operatorów
\
cytuje wszystkie znaki specjalne oprócz nowej linii ( \<newline>
jest to sposób na kontynuację długiej linii logicznej do następnej linii fizycznej , dzięki czemu sekwencja jest usuwana). Zauważ, że backticks dodają dodatkowej złożoności, ponieważ w nich \
są używane, aby uciec przed zamykającym backtick i pomóc parserowi. Wewnątrz cudzysłowach, \
mogą być stosowane tylko uciec się, "
, $
oraz `
( \<newline>
wciąż line-kontynuacja). Wewnątrz dokumentu tutaj, to samo z wyjątkiem "
. \
to jedyny sposób na ucieczkę znaków w dokumentach tutaj.
"..."
podwójne cudzysłowy unikają wszystkich znaków oprócz siebie \
, $
oraz `
.
'...'
pojedyncze cudzysłowy unikają wszystkich znaków oprócz siebie.
Pociski POSIX
Pociski POSIX zachowują się głównie jak powłoka Bourne'a, z tym wyjątkiem, że:
ksh
jak POSIX poza tym, że:
{string}
jest wyjątkowy, jeśli ciąg znaków zawiera cudzysłowy ,
(lub ..
w niektórych przypadkach i przy niektórych wersjach).
- ksh93 ma dodatkowy specjalny operator cytowania:
$'...'
ze złożonymi regułami. Operator, który znajduje się również (z), w pewnych odmianach bash
, zsh
, mksh
i FreeBSD Busybox sh
.
ksh93
ma również $"..."
operator cytowania, który działa podobnie, "..."
z tym że łańcuch podlega lokalizacji (można go skonfigurować tak, aby tłumaczył na język użytkownika). mksh
ignoruje $
w $"..."
.
bash
jak ksh93
ale:
- w ustawieniach jednobajtowych znaków wszystkie puste (zgodnie z ustawieniami narodowymi) znaki są traktowane jako ograniczniki (takie jak spacja lub tabulator). W efekcie oznacza to, że powinieneś zacytować wszystkie bajty z ustawionym 8-tym bitem, na wypadek, gdyby w niektórych lokalizacjach mogły być one pustymi znakami.
- Gdy rozszerzenie historii csh jest włączone, jak w instancjach interaktywnych,
!
jest wyjątkowe w niektórych kontekstach i podwójne cudzysłowy nie zawsze przed nim uciekają. I ^
jest wyjątkowy na początku polecenia.
zsh
jak ksh93
ale:
- ta sama uwaga, jak w
bash
przypadku rozszerzania historii csh
=
jest wyjątkowy jako pierwszy znak słowa ( =ls
rozwija się do /bin/ls
).
{
i }
może również otwierać i zamykać grupy poleceń, gdy nie są rozdzielane (jak w {echo text}
pracach takich jak Bourne'a { echo text;}
).
- z wyjątkiem
[
samego, [
potrzeby cytowane, nawet jeśli nie są zamknięte za pomocą ]
.
- Po włączeniu
extendedglob
opcji #
, ^
i ~
są operatory globowania.
- Dzięki tej
braceccl
opcji {non-empty-string}
jest wyjątkowy.
$"..."
nie jest wspierany.
- jako specjalne dziwactwo,
?
nie jest wyjątkowe, gdy podąża za %
(nawet cytowanym lub rozwiniętym) na początku słowa (aby umożliwić %?name
specyfikację zadania)
rcquotes
opcja (nie domyślnie włączona) pozwala na wpisanie apostrofów jak ''
wewnątrz apostrofów à la rc
(patrz niżej).
yash
jak POSIX
tą różnicą, że.
- wszystkie puste znaki są traktowane jako ograniczniki.
- Dzięki tej
brace-expand
opcji implementuje rozszerzenie nawiasów w stylu zsh.
Dla wszystkich powłok istnieją specjalne konteksty, w których cytowanie działa inaczej. Wspominaliśmy już o dokumentach i backtickach, ale jest też [[...]]
w ksh i kilku innych powłokach, POSIX $((...))
, case
konstrukcjach ...
Należy również pamiętać, że cytowanie może mieć inne skutki uboczne, jeśli chodzi o rozwinięcia (z podwójnymi cudzysłowami) lub w przypadku zastosowania tutaj ograniczników dokumentów. Wyłącza także słowa zastrzeżone i wpływa na rozszerzenie aliasu.
streszczenie
W powłokach podobnych do Bourne'a !#$^&*?[(){}<>~;'"`\|=
SPC, TAB, NEWLINE i niektóre bajty z 8-bitowym zestawem są lub mogą być specjalne (przynajmniej w niektórych kontekstach).
Aby usunąć specjalne znaczenie, aby traktować je dosłownie, użyj cytowania.
Posługiwać się:
'...'
aby usunąć specjalne znaczenie każdej postaci:
printf '%s\n' '\/\/ Those $quoted$ strings are passed literally as
single arguments (without the enclosing quotes) to `printf`'
\
aby usunąć specjalne znaczenie tylko jednego znaku:
printf '<%s>\n' foo bar\ baz #comment
Powyżej tylko znak spacji poprzedzony a \
jest dosłownie przekazywany do printf
. Pozostałe są traktowane przez powłokę jako ograniczniki tokenów.
- używać
"..."
zacytować znaki jednocześnie umożliwiając rozszerzenie parametr ( $var
, $#
, ${foo#bar}
...), wyrażeń arytmetycznych ( $((1+1))
także $[1+1]
w niektórych muszli) i podstawiania poleceń ( $(...)
lub starej formy `...`
. Faktycznie, większość czasu, ty chcesz umieścić te rozszerzenia wewnątrz podwójne cudzysłowy w każdym przypadku . Możesz użyć \
wewnątrz, "..."
aby usunąć specjalne znaczenie znaków, które są nadal wyjątkowe (ale tylko je).
jeśli ciąg zawiera '
znak, nadal możesz użyć '...'
do reszty i użyć innych mechanizmów cytowania, które mogą cytować '
jak "'"
lub \'
lub (jeśli są dostępne) $'\''
:
echo 'This is "tricky", isn'\''t it?'
Użyj nowoczesnej $(...)
formy zastępowania poleceń. Używaj starego tylko `...`
do kompatybilności z powłoką Bourne'a, to jest do bardzo starego systemu i tylko w przypisaniach zmiennych, ponieważ nie używaj:
echo "`echo "foo bar"`"
Co nie będzie działać z wersją powłoki ksh Bourne'a lub AT&T. Lub:
echo "`echo \"foo bar\"`"
Które będą działać z Bourne i AT&T ksh, ale nie z yash
, ale użyj:
var=`echo "foo bar"`; echo "$var"
które będą działać ze wszystkimi.
Niemożliwe jest również zagnieżdżanie ich z użyciem podwójnych cudzysłowów, więc ponownie użyj zmiennych. Uważaj również na specjalne przetwarzanie odwrotnego ukośnika:
var=`printf '%s\n' '\\'`
Będzie przechowywać w środku tylko jeden ukośnik odwrotny $var
, ponieważ istnieje dodatkowy poziom przetwarzania ukośnika odwrotnego (dla \
, `i $
(a także "
gdy jest cytowany, z wyjątkiem in yash
)) w obrębie odwrotnych znaków, więc potrzebujesz albo
var=`printf '%s\n' '\\\\'`
lub
var=`printf '%s\n' '\\\'
zamiast.
Rodzina Csh
csh i tcsh mają znacząco różną składnię, choć nadal ma wiele wspólnego z powłoką Bourne'a, ponieważ mają one wspólne dziedzictwo.
Znaki specjalne:
"\'&|;()^`<>$
, spacje, znaki nowej linii i tabulatory są wyjątkowe wszędzie, gdy nie są cytowane.
#
(csh to powłoka wprowadzona #
jako lider komentarza) jest wyjątkowa na początku skryptu lub po cytowanym spacji, tabulacji lub nowym wierszu.
*?[
są wyjątkowe jako operatory globowania, więc w kontekście list
{non-empty-string}
jest wyjątkowy (csh jest powłoką, która wprowadziła rozszerzenie nawiasu klamrowego).
!
i ^
są wyjątkowe w ramach ekspansji historii (znowu wynalazek csh), a reguły cytowania są wyjątkowe.
~
(rozszerzenie tyldy również wynalazek csh) jest wyjątkowe w niektórych kontekstach.
Cytowanie operatorów
Są takie same jak w przypadku powłoki Bourne'a, ale ich zachowanie jest inne. tcsh zachowuje się jak csh z punktu widzenia składni, przekonasz się, że wiele wersji csh ma paskudne błędy. Pobierz najnowszą wersję tcsh, aby uzyskać z grubsza działającą wersję csh.
\
ucieka przed pojedynczym znakiem z wyjątkiem znaku nowej linii (taki sam jak w przypadku powłoki Bourne'a). Jest to jedyny operator cytowania, który może uciec !
. \<newline>
nie ucieka, ale przekształca go z separatora poleceń w separator tokenów (jak spacja)
"..."
ucieka wszystkie znaki oprócz samego, $
, `
, nowej linii i !
. W przeciwieństwie do powłoki Bourne'a, nie możesz użyć \
do ucieczki $
i `
wewnątrz "..."
, ale możesz użyć \
do ucieczki !
lub nowej linii (ale nie samo, z wyjątkiem sytuacji, gdy znajdował się przed nową !
lub nową linią). Dosłowność !
jest "\!"
i dosłowność \!
jest "\\!"
.
'...'
unika wszystkich znaków oprócz siebie !
i nowej linii. Podobnie jak w przypadku podwójnych cudzysłowów, !
znak nowej linii można usunąć za pomocą odwrotnego ukośnika.
- podstawianie komend odbywa się tylko za pomocą
`...`
składni i nie może być używane niezawodnie.
- podstawianie zmiennych jest również dość źle zaprojektowane i podatne na błędy.
$var:q
Operator pomaga pisać kod udziałem bardziej wiarygodne zmienne.
streszczenie
Trzymaj się z dala od csh, jeśli możesz. Jeśli nie możesz użyć:
- pojedyncze cudzysłowy, aby zacytować większość znaków.
!
i nowa linia nadal potrzebuje \
.
\
może uciec większości postaci
"..."
może zezwalać na niektóre rozszerzenia w nim zawarte, ale jest to dość mylące, jeśli osadzają znaki nowej linii i / lub odwrotny ukośnik, najlepiej używać tylko pojedynczych cudzysłowów i $var:q
do rozszerzania zmiennych. Musisz użyć pętli, jeśli chcesz niezawodnie łączyć elementy tablicy.
rc
rodzina
rc
jest plan9
powłoką i podobnie jak jej potomkowie es
i akanga
został przeniesiony do Uniksa i uniks-like. Jest to powłoka o znacznie bardziej przejrzystej i lepszej składni i ta, której wszyscy używaliby, gdybyśmy nie utknęli z powłokami podobnymi do Bourne'a w celu zapewnienia kompatybilności wstecznej.
rc
/akanga
Znaki specjalne
#;&|^$=`'{}()<>
, SPC, TAB i NEWLINE są zawsze wyjątkowe, gdy nie są cytowane.
*?[
to operatorzy globujący.
Operator cytowania
'...'
jest jedynym operatorem kwotowania. Literatura '
jest zapisywana ''
w pojedynczych cudzysłowach, jak w:
echo 'it''s so simple isn''t it?'
es
es
może być postrzegany jako eksperymentalna powłoka oparta na rc
.
Ma jednak kilka różnic. Interesujące dla tego Q / A jest to, że \
jest także operatorem cytowania (który cytuje wszystkie znaki specjalne oprócz nowej linii) i może być również używany do wprowadzania sekwencji specjalnych, takich jak \n
dla nowej linii, \b
dla odwrotnego ukośnika ...
ryba
fish jest względnym nowicjuszem (około 2005 r.), jest przeznaczony głównie do użytku interaktywnego, a także ma znacznie inną składnię niż inne muszle.
znaki specjalne
"'\()$%{}^<>;&|
zawsze wyjątkowy, gdy nie jest cytowany (zauważ %
(dla rozszerzenia pid) jako istotną różnicę w stosunku do innych powłok i `
nie jest on specjalny)
#
(komentarz) specjalne, gdy podąża za cudzysłowem, tabulatorem, znakiem nowej linii lub ;&|^<>
*?
(ale nie [...]
) operatory globowania
Cytowanie operatorów
\
cytuje pojedynczy znak specjalny oprócz znaku nowej linii, ale uwaga: podwaja się również jako wprowadzający sekwencję zmiany znaczenia C ( \n
, \b
...). IOW, \n
to nie cytowany, n
ale nowy wiersz.
"..."
cytuje wszystko oprócz siebie, $
a odwrotnego ukośnika i odwrotnego ukośnika można użyć do ich ucieczki. \<newline>
jest kontynuacją linii (usuniętą) wewnątrz "..."
.
'...'
cytuje wszystko oprócz siebie \
, i możesz użyć ukośnika odwrotnego, aby uciec przed nimi.
=
,@
I%
są wyjątkowe w niektórych muszli w niektórych kontekstach.