Differenze tra virgolette "", virgolette '' e backtick `` sulla riga di comando?


43

Vedo spesso tutorial sul Web o post su questo sito che fanno un uso intenso dei seguenti personaggi nella riga di comando. Spesso sembra che vengano utilizzati per scopi abbastanza simili. Quali sono le differenze tra loro quando usato sulla riga di comando o per la programmazione della shell? Per quale scopo utilizzo quale di loro?

" " double quotes

' ' single quotes

` ` backticks

Risposte:


43

Per esempio, considera che la variabile foocontiene uname( foo=uname).

  • echo "$foo"output uname, sostituendo le variabili nel testo.
    • Per un $carattere letterale tra "virgolette, usa \$; per un "uso letterale \".
  • echo '$foo'output $foo, la stringa esatta.
    • Anche 'non può essere sfuggito come \'all'interno di 'virgolette. Ma puoi usare 'foo'\''bar'.
  • echo `$foo`output Linux, eseguendo il contenuto della variabile e echostampandolo.

\viene sempre trattato alla lettera se racchiuso tra virgolette singole, anche se precede a '. Dopo un'apertura ', la successiva 'viene sempre interpretata come la citazione di chiusura. È possibile ottenere qualcosa come quotare 'in una stringa a virgoletta singola terminando la citazione, scappando 'singolarmente e ricominciando la citazione. Cioè, mentre \'non funziona tra l'apertura e la chiusura dei 'personaggi, lo '\''fa. (Vedi la correzione di Gilles su uno dei miei post quando ho fatto lo stesso errore per i dettagli.)
Eliah Kagan,

11

Questo è spiegato molto bene nella relativa sezione del manuale di bash. In breve, qualsiasi cosa tra virgolette singole viene interpretata alla lettera. Quindi, per esempio:

$ echo '$SHELL'
$SHELL
$ echo '{1..3}'
{1..3}

Confrontalo con le versioni non quotate:

$ echo $SHELL
/bin/bash
$ echo {1..3}
1 2 3

Le virgolette doppie consentono l'espansione variabile (anche l'espansione della cronologia e alcune altre cose). Fondamentalmente, li usi quando hai a che fare con qualcosa che vuoi vedere espanso. Per esempio:

$ echo "$SHELL"
/bin/bash
$ echo "!!"
echo "echo "$SHELL""
echo /bin/bash

In altre parole, le virgolette singole proteggono completamente una stringa dalla shell mentre le virgolette doppie proteggono alcune cose (spazi ad esempio) ma consentono l'espansione / interpretazione corretta di variabili e caratteri speciali.


1
non sei sicuro che l'OP sia stato modificato dopo il fatto, ma questa risposta non menziona i backtick?
Alexander Mills,

5

Le virgolette singole ( '') vengono utilizzate per preservare il valore letterale di ciascun carattere racchiuso tra virgolette.

Usando le virgolette doppie ( ""), viene conservato il valore letterale di tutti i caratteri racchiusi, ad eccezione del simbolo del dollaro ( $), dei backtick (virgolette singole al contrario, ``) e del backslash ( \).

Se racchiusa tra back-tick ( ``), la shell interpreta qualcosa che significa "l'output del comando all'interno di back-tick". Questo viene definito "sostituzione del comando", poiché l'output del comando viene sostituito con il comando stesso.

Riferimenti:


3
echo '$HOME' is "$HOME"

Le virgolette singole impediscono l'espansione della variabile, mentre le virgolette doppie lo consentono.


2

Sto solo parlando in generale ma:

""- Utilizzato per elaborare alcune informazioni al loro interno prima dell'output. (Come in PHP.)

  • Ad esempio: name=NESS; echo "Hello my name is $name"produrrà:Hello my name is NESS

''- Usato per mostrare l'uscita così com'è. (Come anche in PHP.)

  • Utilizzando l'esempio sopra, verrà emesso Hello my name is $name

Quindi la differenza tra virgolette doppie e singole è che le virgolette doppie elaborano la variabile e mostrano il valore, mentre le virgolette singole mostrano il nome della variabile senza elaborazione.

`` - Utilizzato per citare i comandi che sono successivamente assegnati a un'altra variabile.


1

Le virgolette singole racchiudono un valore che deve essere preso alla lettera: tutti i tipi di espansione vengono soppressi. Solitamente utilizzato se il valore include o può includere uno spazio bianco (spazio, tab, new-line), o caratteri speciali ( $, \, `) che l'utente non desidera essere espanso / trattamento speciale dalla shell.

Le virgolette doppie racchiudono un valore che avrà variabili e la sostituzione del carattere sarà eseguita. Richiesto quando l'output può contenere spazi bianchi e deve essere assegnato come valore singolo.

Le virgolette posteriori racchiudono un comando, i cui risultati sono desiderati come valore. Le shell più recenti ne consentono l'uso $(...)al posto di `...`. Preferisco il metodo più recente.

Il seguente codice può aiutare a capire cosa sta succedendo.

CMD = 'ls.'
echo sq: $ CMD
impostare $ CMD
echo raw 1: $ 1
eco crudo: $ *
imposta "$ CMD"
eco dq: $ 1
echo bq: `$ CMD`
echo new: $ ($ CMD)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.