GNU/Linux >> Linux Esercitazione >  >> Linux

Differenza tra virgolette singole e doppie in Bash Shell

Utilizzerai spesso le virgolette nella riga di comando di Linux. Hai a che fare con gli spazi nel nome del file? Tu usi le virgolette. Gestire caratteri speciali? Utilizza di nuovo le virgolette.

Le virgolette sono "caratteristiche speciali" nella shell di Linux e possono creare confusione, specialmente se non conosci i comandi Linux e gli script di shell.

Spiegherò i diversi tipi di virgolette e il loro utilizzo negli script di shell.

Esistono quattro diversi tipi di virgolette:

  • Citazione singola '
  • Citazione doppia "
  • Barra rovesciata \
  • Citazione indietro `

Tranne il contraccolpo, il resto dei tre caratteri si presenta in coppia.

Diamo un'occhiata a loro in dettaglio.

1. Citazione singola

La virgoletta singola in Shell ignora tutti i tipi di caratteri speciali in essa contenuti. Tutto tra le virgolette singole è considerato un unico elemento.

Prendiamolo con l'esempio. Ecco un file di testo di esempio con alcuni giocatori di cricket degli anni '90.

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

Ora usi il comando grep per cercare giocatori di cricket con il cognome Waugh. Questo ti darà due risultati:

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

Ma se vuoi cercare solo Steve Waugh e provi a usarlo così com'è, vedrai un errore:

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

Come mai? Perché lo spazio viene utilizzato per separare comando, opzioni e argomento. Nell'esempio sopra, ci vuole Steve come primo argomento di grep ma Waugh e cricket vengono presi come i file in cui dovrebbe effettuare la ricerca. Poiché non esiste un file chiamato Waugh , genera un errore per quello. Allo stesso tempo, mostra anche il risultato del file cricket .

È qui che la citazione viene in soccorso. Quando racchiudi gli argomenti tra virgolette, viene interpretato come una singola entità.

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

Fondamentalmente, quando la shell vede la prima virgoletta singola, ignora tutti i caratteri speciali (anche lo spazio bianco è un carattere speciale) finché non trova un'altra virgoletta singola (virgolette di chiusura).

Ignora tutti i caratteri speciali

Tutti i caratteri speciali perdono il loro significato se sono racchiusi tra virgolette singole. Vediamolo con degli esempi.

Dichiariamo una variabile in shell. Se fai eco al nome della variabile con $, mostra il valore della variabile.

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

Ma se lo racchiudi tra virgolette singole, $ perderà il suo potere speciale.

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

Ora solo quello. Anche la chiave di invio viene conservata tra virgolette singole.

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

2. Doppia virgoletta

Le virgolette doppie funzionano quasi in modo simile alle virgolette singole. Quasi perché tendono anche a ignorare tutti i caratteri speciali tranne:

  • Segni del dollaro $
  • Citazioni indietro `
  • Barre inverse \

Poiché il simbolo del dollaro non viene ignorato, puoi aspettarti che il nome della variabile venga sostituito con il suo valore. Il che non è il caso delle virgolette singole.

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

Le virgolette doppie possono essere utilizzate per nascondere le virgolette singole dalla shell.

[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

Allo stesso modo, puoi usare le virgolette singole per nascondere le virgolette doppie dalla shell.

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

3. Barra rovesciata

Backslash è come mettere virgolette singole attorno a un singolo carattere. La barra rovesciata "sfugge" al carattere che precede.

Ciò significa che il carattere seguito dalla barra rovesciata perderà il suo significato speciale (se presente).

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

Perché v non ha un significato speciale, echo \var stampa semplicemente var. D'altra parte, quando viene utilizzato con $var , la barra rovesciata sfugge al significato speciale di $ e quindi viene stampato come $var invece del valore di var .

Continua la riga con backslash

Noterai un altro uso pratico del carattere barra rovesciata nel continuare un singolo comando su più righe.

Quando un comando è troppo lungo o se è una combinazione di comandi, vedrai alcuni siti Web che utilizzano la barra rovesciata per visualizzare il singolo comando su più di una riga. Questo rende il comando/codice più leggibile.

Prendi questo lungo comando per esempio.

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

Lo stesso comando può essere suddiviso in più righe grazie alle barre inverse.

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

È lo stesso comando, solo un po' più facile da capire.

Barra inversa tra virgolette doppie

La barra rovesciata è uno dei tre caratteri speciali che mantiene il suo significato speciale insieme al simbolo del dollaro e alle virgolette.

In questo modo, puoi utilizzare la barra rovesciata per sfuggire al significato speciale del simbolo del dollaro, virgolette doppie e virgolette tra virgolette doppie.

Prendi l'esempio seguente dove $5 è considerata una variabile che non è dichiarata e quindi non ha valore. Questo è il motivo per cui viene ignorato dall'output del comando echo.

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

Per usare questo $ senza essere interpretato come il valore di una variabile, devi fare un escape con /.

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

Qui, la barra rovesciata (\) viene interpretata per il suo superpotere, che è quello di sfuggire al significato speciale del carattere successivo.

4. virgolette indietro

L'ultimo in questo elenco è virgolette indietro e ha un significato speciale. Viene utilizzato per la sostituzione dei comandi.

La shell ha questa funzione di sostituzione dei comandi in cui un comando specificato viene sostituito con l'output del comando.

Nell'esempio seguente, `date` è sostituito dall'output del comando date che mostra la data e l'ora correnti del sistema 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

Una cosa da tenere a mente è che la sostituzione avverrà solo se c'è un comando tra le virgolette. In caso contrario, viene visualizzato così com'è.

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

Anche in questo caso, le virgolette doppie interpretano le virgolette posteriori, ma le virgolette singole ne ignorano il significato speciale.

Per anni, le virgolette indietro sono state utilizzate per la sostituzione dei comandi negli script Shell. Ma oggigiorno, i moderni sistemi UNIX e Linux preferiscono il $(command) costruisci invece.

[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

Rimani con il tempo e smetti di usare le virgolette indietro ora.

Spero che tu abbia una migliore comprensione delle virgolette in Linux e degli script di shell ora.

Si prega di lasciare i vostri suggerimenti e domande nella sezione commenti.


Linux
  1. Qual è la differenza tra #!/usr/bin/env bash e #!/usr/bin/bash?

  2. Differenza tra ${} e $() in Bash

  3. Qual è la differenza tra &> e >&in bash?

  4. Differenza tra i comandi nello script bash e i comandi nel terminale

  5. Qual è la differenza tra apt-get e aptitude?

Differenza tra la definizione di variabili Bash con e senza esportazione

Qual è la differenza tra Login e Non-Login Shell

La differenza tra un comando integrato e uno che non lo è?

La differenza tra [[ $a ==Z* ]] e [ $a ==Z* ]?

Qual è la differenza tra una console, un terminale e una shell?

Differenza tra '{}' e {} nel comando find?