Quando utilizzare virgolette singole, virgolette doppie in grep?


20

Durante il tentativo di cercare un semplice schema "ciao" in un file, funzionano tutte le seguenti forme di grep:

  • grep hello file1
  • grep 'ciao' file1
  • grep "ciao" file1

Esiste un caso specifico in cui una delle forme sopra funziona ma altre no. Fa differenza se ne uso uno al posto di un altro?

Risposte:


25

Questo in realtà dipende dalla tua shell. Le citazioni (di entrambi i tipi) hanno principalmente lo scopo di gestire gli spazi bianchi. Ad esempio, quanto segue:

grep hello world file1

cercherà la parola "ciao" nei file chiamati "mondo" e "file1", mentre

grep "hello world" file1

cercherà "ciao mondo" in file1.

La scelta tra virgolette singole o doppie è importante solo se la stringa di ricerca contiene variabili o altri elementi che si prevede vengano valutati. Con virgolette singole, la stringa viene presa letteralmente e non si verifica alcuna espansione. Con le virgolette doppie, le variabili vengono espanse. Ad esempio (con una shell derivata da Bourne come Bash o ZSH):

VAR="serverfault"
grep '$VAR' file1
grep "$VAR" file1

Il primo grepcercherà la stringa letterale "$ VAR1" nel file1. Il secondo espanderà la variabile "$ VAR" e cercherà la stringa "serverfault" in file1.


La cosa fondamentale da notare è che nella domanda originale, grep riceve effettivamente gli stessi argomenti ogni volta.
MikeyB,

2
Stai attento lì. $è fine linea in un'espressione regolare, quindi $VAR1non dovrebbe mai corrispondere a nulla. Capita di funzionare su GNU grep, ma ancora non contare su quel comportamento. Dovresti \$VAR1abbinare in modo sicuro la stringa letterale. (E avresti bisogno di barre rovesciate extra se questo è tra virgolette doppie.)
Steven Pritchard

7

James ha ragione, ma per aggiungere altri dati, penso che il modo migliore di pensarci sia come argomenti al comando: intendi "ciao" e "mondo" come due argomenti o "ciao mondo" per essere uno discussione.

Inoltre, le virgolette consentono l'interpretazione di più di semplici variabili. Esattamente ciò che dipende dalla shell, ma controlla l'espansione della cronologia, l'espansione del controvento e l'espansione del nome file.

È anche importante notare che ci sono alcuni casi in cui è necessario utilizzare entrambi i tipi di virgolette in un singolo argomento. Ricorda che gli argomenti (di default) sono delimitati da spazi bianchi, quindi se non lasci alcuno spazio, stai ancora specificando lo stesso argomento.

Il meccanismo a virgoletta singola della maggior parte delle shell non consente caratteri speciali, il che significa che qualsiasi istanza di un'altra virgoletta singola, anche se sembra essere sfuggita, termina la citazione. È quindi impossibile passare una stringa con una virgoletta singola all'interno di una stringa a virgoletta singola e devi usare virgolette doppie. Questo può essere un dolore quando vuoi passare un argomento che contiene virgolette singole e qualcosa che dovrebbe essere interpretato, ma non vuoi esserlo. Ad esempio, se si desidera passare la stringa letterale "` `$ VAR 'è una variabile", è necessario farlo in questo modo:

"'"'$VAR'"' is a variable"

Questa è in realtà una concatenazione di tre stringhe con escape tra virgolette:

"'"
'$VAR'
"' is a variable"

oppure, con le virgolette rimosse:

'
$VAR
' is a variable

In realtà, con la maggior parte delle shell, puoi anche farlo in questo modo:

"'\$VAR' is a variable"

dove la barra rovesciata (" \") dice alla shell di accettare letteralmente il seguente carattere e di non fare alcuna espansione su di esso.

Ma ci sono alcuni casi in cui finisci per farlo nel modo di concatenazione di più stringhe, non che in questo momento riesca a trovare un esempio.

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.