Unix / Linux - mechanizmy cytowania powłoki
W tym rozdziale omówimy szczegółowo mechanizmy cytowania Shell. Zaczniemy od omówienia metaznaków.
Metaznaki
Unix Shell zapewnia różne metaznaki, które mają specjalne znaczenie podczas używania ich w jakimkolwiek skrypcie powłoki i powoduje zakończenie słowa, chyba że są one cytowane.
Na przykład, ? pasuje do pojedynczego znaku podczas wyświetlania plików w katalogu i pliku *dopasowuje więcej niż jeden znak. Oto lista większości znaków specjalnych powłoki (zwanych także metaznakami) -
* ? [ ] ' " \ $ ; & ( ) | ^ < > new-line space tab
Znak można cytować (tzn. Ustawić, aby sam siebie) poprzedzał go znakiem \.
Przykład
Poniższy przykład pokazuje, jak wydrukować plik * lub a ? -
#!/bin/sh
echo Hello; Word
Po wykonaniu otrzymasz następujący wynik -
Hello
./test.sh: line 2: Word: command not found
shell returned 127
Spróbujmy teraz użyć cytowanego znaku -
#!/bin/sh
echo Hello\; Word
Po wykonaniu otrzymasz następujący wynik -
Hello; Word
Plik $ znak jest jednym z metaznaków, więc musi być cytowany, aby uniknąć specjalnego traktowania przez powłokę -
#!/bin/sh
echo "I have \$1200"
Po wykonaniu otrzymasz następujący wynik -
I have $1200
W poniższej tabeli wymieniono cztery formy cytowania -
Sr.No. | Cytowanie i opis |
---|---|
1 | Single quote Wszystkie znaki specjalne w tych cudzysłowach tracą swoje specjalne znaczenie. |
2 | Double quote Większość znaków specjalnych między tymi cudzysłowami traci swoje specjalne znaczenie z tymi wyjątkami -
|
3 | Backslash Każdy znak występujący bezpośrednio po odwrotnym ukośniku traci swoje specjalne znaczenie. |
4 | Back quote Wszystko, co znajduje się pomiędzy cudzysłowami wstecznymi, będzie traktowane jako polecenie i zostanie wykonane. |
Pojedyncze cytaty
Rozważmy polecenie echo, które zawiera wiele specjalnych znaków powłoki -
echo <-$1500.**>; (update?) [y|n]
Umieszczenie odwrotnego ukośnika przed każdym znakiem specjalnym jest żmudne i utrudnia odczytanie wiersza -
echo \<-\$1500.\*\*\>\; \(update\?\) \[y\|n\]
Istnieje łatwy sposób zacytowania dużej grupy znaków. Umieść pojedynczy cudzysłów (') na początku i na końcu ciągu -
echo '<-$1500.**>; (update?) [y|n]'
Znaki w pojedynczych cudzysłowach są cytowane tak, jakby przed każdym znakiem znajdował się ukośnik odwrotny. Dzięki temu polecenie echo wyświetla się we właściwy sposób.
Jeśli pojedynczy cudzysłów pojawia się w ciągu, który ma zostać wyprowadzony, nie należy umieszczać całego ciągu w pojedynczych cudzysłowach, zamiast tego należy poprzedzić go ukośnikiem odwrotnym (\) w następujący sposób -
echo 'It\'s Shell Programming
Podwójne cytaty
Spróbuj wykonać następujący skrypt powłoki. Ten skrypt powłoki używa pojedynczego cudzysłowu -
VAR=ZARA
echo '$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]'
Po wykonaniu otrzymasz następujący wynik -
$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]
Nie to musiało być wyświetlane. Jest oczywiste, że pojedyncze cudzysłowy uniemożliwiają podstawianie zmiennych. Jeśli chcesz zastąpić wartości zmiennych i sprawić, by przecinki działały zgodnie z oczekiwaniami, musisz umieścić swoje polecenia w podwójnych cudzysłowach w następujący sposób -
VAR=ZARA
echo "$VAR owes <-\$1500.**>; [ as of (`date +%m/%d`) ]"
Po wykonaniu otrzymasz następujący wynik -
ZARA owes <-$1500.**>; [ as of (07/02) ]
Podwójne cudzysłowy usuwają specjalne znaczenie wszystkich znaków z wyjątkiem następujących -
$ do podstawiania parametrów
Cudzysłowy zastępujące polecenia
\$ aby włączyć dosłowne znaki dolara
\` aby włączyć dosłowne cudzysłowy
\" aby włączyć osadzone podwójne cudzysłowy
\\ aby włączyć osadzone odwrotne ukośniki
Wszystkie inne \ znaki są dosłowne (nie specjalne)
Znaki w pojedynczych cudzysłowach są cytowane tak, jakby przed każdym znakiem znajdował się ukośnik odwrotny. Pomaga to poprawnie wyświetlać polecenie echo.
Jeśli pojedynczy cudzysłów pojawia się w ciągu, który ma zostać wyprowadzony, nie należy umieszczać całego ciągu w pojedynczych cudzysłowach, zamiast tego należy poprzedzić go ukośnikiem odwrotnym (\) w następujący sposób -
echo 'It\'s Shell Programming'
Backquotes
Umieszczanie dowolnego polecenia Shell pomiędzy backquotes wykonuje polecenie.
Składnia
Oto prosta składnia do umieszczenia dowolnej powłoki command pomiędzy odwrotnymi cytatami -
var=`command`
Przykład
Plik date polecenie jest wykonywane w poniższym przykładzie, a otrzymany wynik jest przechowywany w zmiennej DATA.
DATE=`date`
echo "Current Date: $DATE"
Po wykonaniu otrzymasz następujący wynik -
Current Date: Thu Jul 2 05:28:45 MST 2009