Qual è la differenza tra grep apple file e grep "apple" file?

22

Qual è la differenza tra grep apple file e grep "apple" file ? Cosa fa mettere le virgolette? Entrambi sembrano funzionare e fanno esattamente la stessa cosa (mostra la stessa linea).

    
posta John Stacen 03.10.2013 - 10:54

2 risposte

45

Le virgolette hanno effetto su quali caratteri la tua shell considera speciale e per avere un significato sintattico. Nel tuo esempio questo non fa differenza perché apple non contiene tali caratteri.

Consideriamo un altro esempio: grep apple tree file cercherà la parola apple nei file tree e file , mentre grep "apple tree" file cercherà la parola apple tree nel file file . Le virgolette dicono bash, che la parola spazio in "apple tree" non inizia un nuovo parametro ma deve far parte del parametro corrente. grep apple\ tree file produrrebbe lo stesso risultato, perché \ dice a bash di ignorare il significato speciale del seguente carattere e trattarlo letteralmente.

    
risposta data David Foerster 03.10.2013 - 11:03
23

Le doppie virgolette consentono la valutazione, le virgolette singole impediscono la valutazione, le virgolette non consentono l'espansione di caratteri jolly, se usate sulla riga di comando. Come esempi forzati:

[[email protected] test]$ ls .
A.txt B.txt C.txt D.cpp

# The following is the same as writing echo 'A.txt B.txt C.txt D.cpp'
[[email protected] test]$ echo *
A.txt B.txt C.txt D.cpp

[[email protected] test]$ echo "*"
*

[[email protected] test]$ echo '*'
*

# The following is the same as writing echo 'A.txt B.txt C.txt'
[[email protected] test]$ echo *.txt
A.txt B.txt C.txt

[[email protected] test]$ echo "*.txt"
*.txt

[[email protected] test]$ echo '*.txt'
*.txt

[[email protected] test]$ myname=is Fred; echo $myname
bash: Fred: command not found

[[email protected] test]$ myname=is\ Fred; echo $myname
is Fred

[[email protected] test]$ myname="is Fred"; echo $myname
is Fred

[[email protected] test]$ myname='is Fred'; echo $myname
is Fred

Capire il modo in cui le virgolette funzionano è fondamentale per comprendere Bash. Ad esempio:

# for will operate on each file name separately (like an array), looping 3 times.
[[email protected] test]$ for f in $(echo *txt); do echo "$f"; done;
A.txt
B.txt
C.txt

# for will see only the string, 'A.txt B.txt C.txt' and loop just once.
[[email protected] test]$ for f in "$(echo *txt)"; do echo "$f"; done;
A.txt B.txt C.txt

# this just returns the string - it can't be evaluated in single quotes.
[[email protected] test]$ for f in '$(echo *txt)'; do echo "$f"; done;
$(echo *txt)

Puoi usare le virgolette singole per passare un comando tramite una variabile. Le virgolette singole impediranno la valutazione. Le doppie virgolette valuteranno.

# This returns three distinct elements, like an array.
[[email protected] test]$ echo='echo *.txt'; echo $($echo)
A.txt B.txt C.txt

# This returns what looks like three elements, but it is actually a single string.
[[email protected] test]$ echo='echo *.txt'; echo "$($echo)"
A.txt B.txt C.txt

# This cannot be evaluated, so it returns whatever is between quotes, literally.
[[email protected] test]$ echo='echo *.txt'; echo '$($echo)'
$($echo)

Puoi usare virgolette singole tra virgolette doppie e puoi usare virgolette doppie tra virgolette doppie, ma le virgolette tra virgolette singole non dovrebbero essere fatte (senza sfuggirle) non saranno valutate, saranno essere interpretato alla lettera Le virgolette singole tra virgolette singole non dovrebbero essere eseguite (senza sfuggirle).

Dovrai acquisire una conoscenza approfondita delle offerte per utilizzare Bash in modo efficace. Molto importante!

Come regola generale, non uso le virgolette se voglio che Bash espanda qualcosa in elementi (come una matrice), io uso virgolette singole per stringhe letterali che non devono essere alterate e faccio un uso liberale del doppio preventivi per variabili che potrebbero restituire qualsiasi tipo di stringa. Questo per garantire che spazi e caratteri speciali siano preservati.

    
risposta data AsymLabs 03.10.2013 - 19:36

Leggi altre domande sui tag