repo
Polecenie nie może obchodzi jakie cytaty robi. Jeśli potrzebujesz rozszerzenia parametrów, użyj podwójnych cudzysłowów. Jeśli to oznacza, że musisz skończyć z odwrotnym ukośnikiem wiele rzeczy, użyj pojedynczych cudzysłowów dla większości z nich, a następnie wyrwij się z nich i przejdź do podwójnych w części, w której potrzebujesz rozszerzenia.
repo forall -c 'literal stuff goes here; '"stuff with $parameters here"' more literal stuff'
Wyjaśnienie następuje, jeśli jesteś zainteresowany.
Po uruchomieniu polecenia z powłoki to polecenie otrzymuje jako argumenty tablicę ciągów zakończonych znakiem null. Ciągi te mogą zawierać absolutnie dowolny znak inny niż zero.
Ale gdy powłoka buduje tablicę ciągów z wiersza poleceń, interpretuje niektóre znaki specjalnie; ma to na celu ułatwienie (a nawet możliwość) wykonywania poleceń. Na przykład spacje zwykle wskazują granicę między łańcuchami w tablicy; z tego powodu poszczególne argumenty są czasami nazywane „słowami”. Niemniej jednak w sporze mogą znajdować się spacje; potrzebujesz tylko sposobu, aby powiedzieć powłoce, że tego chcesz.
Możesz użyć odwrotnego ukośnika przed dowolną postacią (w tym spacją lub innym odwrotnym ukośnikiem), aby powiedzieć powłoce, aby traktowała tę postać dosłownie. Ale chociaż możesz zrobić coś takiego:
echo \"Thank\ you.\ \ That\'ll\ be\ \$4.96,\ please,\"\ said\ the\ cashier
... może być męczące. Powłoka oferuje więc alternatywę: znaki cudzysłowu. Występują w dwóch głównych odmianach.
Podwójne cudzysłowy nazywane są „grupowaniem cudzysłowów”. Zapobiegają rozszerzaniu symboli wieloznacznych i aliasów, ale głównie służą do umieszczania spacji w słowie. Inne rzeczy, takie jak rozszerzanie parametrów i poleceń (rzeczy sygnalizowane przez a $
) nadal występują. I oczywiście, jeśli chcesz literalnego podwójnego cudzysłowu w cudzysłowach, musisz odwrócić ukośnik:
echo "\"Thank you. That'll be \$4.96, please,\" said the cashier"
Znaki pojedynczego cudzysłowu są bardziej drakońskie. Wszystko między nimi jest brane całkowicie dosłownie, łącznie z odwrotnymi ukośnikami. Nie ma absolutnie żadnego sposobu na uzyskanie dosłownego pojedynczego cytatu w pojedynczych cytatach.
Na szczęście znaki cudzysłowu w powłoce nie są ogranicznikami słów ; same w sobie nie kończą słowa. Możesz wchodzić i wychodzić z cytatów, w tym między różnymi typami cytatów, w ramach tego samego słowa, aby uzyskać pożądany wynik:
echo '"Thank you. That'\''ll be $4.96, please," said the cashier'
To jest łatwiejsze - dużo mniej odwrotnych ukośników, chociaż przyzwyczajenie się do sekwencji z zamkniętym cytatem, odwróconego literału-pojedynczego cytatu, otwartego pojedynczego cytatu.
Nowoczesne powłoki dodały inny styl cytowania nieokreślony przez standard POSIX, w którym wiodący pojedynczy cudzysłów jest poprzedzony znakiem dolara. Tak cytowane łańcuchy są zgodne z konwencjami podobnymi do literałów łańcuchowych w języku programowania ANSI C i dlatego są czasami nazywane „ciągami ANSI” i $'
… '
parą „cudzysłowów ANSI”. W przypadku takich ciągów powyższa rada dotycząca dosyłania ukośników dosłownie nie ma już zastosowania. Zamiast tego stają się ponownie wyjątkowe - nie tylko można dołączyć dosłowny pojedynczy cudzysłów lub ukośnik odwrotny, przygotowując do niego odwrotny ukośnik, ale powłoka rozszerza także znaki ucieczki znaku ANSI C (jak \n
dla nowej linii, \t
dla tabu i \xHH
dla znaku z kod szesnastkowyHH
). W przeciwnym razie zachowują się jak ciągi cudzysłowu: nie następuje podstawienie parametru ani polecenia:
echo $'"Thank you. That\'ll be $4.96, please," said the cashier'
Należy zauważyć, że pojedynczy ciąg otrzymany jako argument echo
polecenia jest dokładnie taki sam we wszystkich tych przykładach. Po zakończeniu analizy powłoki w wierszu poleceń nie można uruchomić polecenia, aby powiedzieć, co zostało zacytowane. Nawet gdyby chciał.
repo forall -c ' ...before... '"$variable"' ...after...'