GNU/Linux >> Znalost Linux >  >> Linux

Rozdíl mezi jednoduchou a dvojitou citací v Bash Shell

V příkazovém řádku Linuxu budete často používat uvozovky. Zacházení s mezerami v souboru? Používáte uvozovky. Zvládáte speciální znaky? Opět používáte uvozovky.

Uvozovky jsou 'speciální funkcí' v linuxovém shellu a mohou být matoucí, zvláště pokud jste nováčci v Linuxových příkazech a skriptování shellu.

Vysvětlím různé typy znaků uvozovek a jejich použití ve skriptování shellu.

Existují čtyři různé typy znaků uvozovek:

  • Jedná uvozovka
  • Dvojité uvozovky „
  • Zpětné lomítko \
  • Zadní uvozovka `

Kromě zpětného rázu se zbývající tři znaky vyskytují v páru.

Pojďme se na ně podívat podrobně.

1. Jednoduchá citace

Jednoduchá uvozovka v Shell ignoruje všechny typy speciálních znaků v ní. Vše mezi jednoduchými uvozovkami je považováno za jeden jediný prvek.

Vezměme si to na příkladu. Zde je ukázkový textový soubor s některými hráči kriketu z 90. let.

[email protected]:~$ cat cricket 
Allan Donald, South Africa
Steve Waugh, Australia
Mark Waugh, Australia
Henry Olonga, Zimbabwe
Sachin Tendulkar, India

Nyní použijete příkaz grep k vyhledání hráčů kriketu s příjmením Waugh. Získáte dva výsledky:

[email protected]:~$ grep Waugh cricket
Steve Waugh, Australia
Mark Waugh, Australia

Pokud však chcete hledat pouze Steva Waugha a zkusíte jej použít tak, jak je, zobrazí se chyba:

[email protected]:~$ grep Steve Waugh cricket
grep: Waugh: No such file or directory
cricket:Steve Waugh, Australia

Proč? Protože k oddělení příkazu, voleb a argumentu se používá mezera. Ve výše uvedeném příkladu to trvá Steve jako první argument pro grep, ale Waugh a cricket jsou brány jako soubory, ve kterých by měl provádět vyhledávání. Protože neexistuje žádný soubor s názvem Waugh , vyhodí to chybu. Zároveň také zobrazuje výsledek ze souboru cricket .

Zde přichází na pomoc citace. Když argumenty uzavřete do uvozovek, bude to interpretováno jako jedna entita.

[email protected]:~$ grep 'Steve Waugh' cricket
Steve Waugh, Australia

V zásadě, když shell uvidí první jednoduchou uvozovku, ignoruje všechny speciální znaky (bílé místo je také speciální znak), dokud nenajde další jednoduchou uvozovku (uzavírací uvozovky).

Ignorování všech speciálních znaků

Všechny speciální znaky ztrácejí svůj význam, pokud jsou uzavřeny v jednoduchých uvozovkách. Podívejme se na to na příkladech.

Pojďme deklarovat proměnnou v shellu. Pokud změníte název proměnné s $, zobrazí se hodnota proměnné.

[email protected]:~$ var=my_variable
[email protected]:~$ echo $var
my_variable

Ale pokud to zabalíte do jednoduchých uvozovek, $ ztratí svou zvláštní sílu.

[email protected]:~$ echo '$var'
$var

Teď už jen to. Klávesa enter je také zachována v jednoduchých uvozovkách.

[email protected]:~$ echo 'how are
> you?'
how are
you?

2. Dvojitá uvozovka

Dvojité uvozovky fungují téměř podobně jako jednoduché uvozovky. Téměř proto, že také mají tendenci ignorovat všechny speciální znaky kromě:

  • Znaky dolaru $
  • Zadní uvozovky `
  • Zpětná lomítka \

Protože znak dolaru není ignorován, můžete očekávat, že název proměnné bude nahrazen její hodnotou. Což není případ jednoduchých uvozovek.

[email protected]:~$ var=my_variable
[email protected]:~$ echo "$var"
my_variable
[email protected]:~$ echo '$var'
$var

Dvojité uvozovky lze použít ke skrytí jednoduchých uvozovek z shellu.

[email protected]:~$ var=My 'own villa' is yellow
own villa: command not found
[email protected]:~$ var="My 'own villa' is yellow"
[email protected]:~$ echo $var
My 'own villa' is yellow

Podobně můžete použít jednoduché uvozovky ke skrytí dvojitých uvozovek z shellu.

[email protected]:~$ var=he said, "Awesome!"
said,: command not found
[email protected]:~$ var='he said, "Awesome!"'
[email protected]:~$ echo $var
he said, "Awesome!"

3. Zpětné lomítko

Zpětné lomítko je jako vkládání jednoduchých uvozovek kolem jednoho znaku. Zpětné lomítko „unikne“ znaku, před kterým je umístěn.

To znamená, že znak následovaný zpětným lomítkem ztratí svůj speciální význam (pokud existuje).

[email protected]:~$ var=variable
[email protected]:~$ echo \var
var
[email protected]:~$ echo $var
variable
[email protected]:~$ echo \$var
$var

Protože v nemá žádný zvláštní význam, echo \var prostě tiskne var. Na druhou stranu, když je použit s $var , zpětné lomítko uniká speciálnímu významu $ a proto se vytiskne jako $var místo hodnoty var .

Pokračovat v řádku zpětným lomítkem

Další praktické použití znaku zpětného lomítka si všimnete při pokračování jednoho příkazu na více řádcích.

Pokud je příkaz příliš dlouhý nebo se jedná o kombinaci příkazů, uvidíte, že některé webové stránky používají zpětné lomítko k zobrazení jediného příkazu na více než jednom řádku. Díky tomu je příkaz/kód čitelnější.

Vezměte si například tento dlouhý příkaz.

docker run --name server --network net -v html:/usr/share/nginx/html -v $PWD/custom-config.conf:/etc/nginx/nginx.conf -p 80:80 --restart on-failure -d nginx:latest

Stejný příkaz lze rozdělit na více řádků díky zpětným lomítkům.

docker run --name server --network net \
-v html:/usr/share/nginx/html \
-v $PWD/custom-config.conf:/etc/nginx/nginx.conf \
-p 80:80 --restart on-failure -d nginx:latest

Je to stejný příkaz, jen je trochu srozumitelnější.

Zpětné lomítko uvnitř dvojitých uvozovek

Zpětné lomítko je jeden ze tří speciálních znaků, který si uchovává svůj speciální význam spolu se znakem dolaru a zadními uvozovkami.

Tímto způsobem můžete použít zpětné lomítko, abyste unikli zvláštnímu významu znaku dolaru, dvojitých uvozovkách a zpětných uvozovek v uvozovkách.

Vezměte si níže uvedený příklad, kde $5 je považována za proměnnou, která není deklarována, a proto nemá žádnou hodnotu. Proto je ve výstupu příkazu echo ignorován.

[email protected]:~$ echo "Meal costs $5.25"
Meal costs .25

Chcete-li použít tento $, aniž by byl interpretován jako hodnota proměnné, musíte jej ukončit pomocí /.

[email protected]:~$ echo "Meal costs \$5.25"
Meal costs $5.25

Zde je zpětné lomítko (\) interpretováno jako jeho superschopnost, která má uniknout zvláštnímu významu následující postavy.

4. Zpětné uvozovky

Poslední v tomto seznamu jsou zpětné uvozovky a mají zvláštní význam. Používá se pro substituci příkazů.

Shell má tuto funkci nahrazování příkazů, kde je zadaný příkaz nahrazen výstupem příkazu.

V níže uvedeném příkladu je `date` nahrazeno výstupem příkazu date zobrazujícím aktuální datum a čas systému Linux.

[email protected]:~$ echo The current date and time is `date`
The current date and time is Monday 23 August 2021 04:55:18 PM IST

Jedna věc, kterou je třeba mít na paměti, je, že k nahrazení dojde pouze v případě, že je mezi zadními uvozovkami příkaz. Jinak se zobrazí tak, jak je.

[email protected]:~$ echo 'The current date and time is `late`'
The current date and time is `late`

Opět platí, že dvojité uvozovky interpretují zadní uvozovky, ale jednoduché uvozovky ignorují jejich speciální význam.

Po celá léta byly zadní uvozovky používány pro nahrazování příkazů ve skriptování Shell. Ale v dnešní době moderní systémy UNIX a Linux preferují $(command) místo toho konstruovat.

[email protected]:~$ echo The current date and time is $(date)
The current date and time is Monday 23 August 2021 05:55:47 PM IST

Zůstaňte s časem a přestaňte nyní používat zadní uvozovky.

Doufám, že nyní lépe rozumíte uvozovkám v Linuxu a shell skriptování.

Zanechte prosím své návrhy a dotazy v sekci komentářů.


Linux
  1. Rozdíl mezi přihlašovacím prostředím a nepřihlašovacím prostředím?

  2. Rozdíl mezi vestavěným příkazem a příkazem, který není?

  3. Rozdíl mezi [[ $a ==Z* ]] a [ $a ==Z* ]?

  1. Rozdíl mezi proměnnými Shell, které se exportují, a těmi, které nejsou v Bash?

  2. Linux – Jaký je rozdíl mezi `su -` a `su –login`?

  3. Jaký je rozdíl mezi #!/usr/bin/env bash a #!/usr/bin/bash?

  1. Jaký je rozdíl mezi nohoup a ampersand

  2. Jaký je rozdíl mezi &> a >&v bash?

  3. Jaký je rozdíl mezi apt-get a aptitude?