web-dev-qa-db-fra.com

Quelle est la différence entre le fichier grep Apple et le fichier "Apple" de grep?

Quelle est la différence entre grep Apple file et grep "Apple" file? Que font les guillemets? Ils semblent tous les deux fonctionner et faire exactement la même chose (afficher la même ligne).

22
John Stacen

Les guillemets ont une incidence sur les caractères que votre shell considère comme spéciaux et qui ont une signification syntaxique. Dans votre exemple, cela ne fait aucune différence, car Apple ne contient pas de tels caractères.

Mais prenons un autre exemple: grep Apple tree file cherchera le mot Apple dans les fichiers tree et file, tandis que grep "Apple tree" file cherchera le mot Apple tree dans le fichier file. Les guillemets indiquent à bash que l'espace Word dans "Apple tree" ne commence pas un nouveau paramètre mais doit faire partie du paramètre actuel. grep Apple\ tree file produirait le même résultat, car \ indique à bash de ne pas tenir compte de la signification particulière du caractère suivant et de le traiter littéralement.

45
David Foerster

Les guillemets doubles permettent l'évaluation, les guillemets simples empêchent l'évaluation, aucune citation n'autorise le développement de caractères génériques, lorsqu'elle est utilisée en ligne de commande. Comme exemples artificiels:

[user@work 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'
[user@work test]$ echo *
A.txt B.txt C.txt D.cpp

[user@work test]$ echo "*"
*

[user@work test]$ echo '*'
*

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

[user@work test]$ echo "*.txt"
*.txt

[user@work test]$ echo '*.txt'
*.txt

[user@work test]$ myname=is Fred; echo $myname
bash: Fred: command not found

[user@work test]$ myname=is\ Fred; echo $myname
is Fred

[user@work test]$ myname="is Fred"; echo $myname
is Fred

[user@work test]$ myname='is Fred'; echo $myname
is Fred

Comprendre le fonctionnement des citations est essentiel à la compréhension de Bash. Par exemple:

# for will operate on each file name separately (like an array), looping 3 times.
[user@work 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.
[user@work 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.
[user@work test]$ for f in '$(echo *txt)'; do echo "$f"; done;
$(echo *txt)

Vous pouvez utiliser des guillemets simples pour passer une commande via une variable. Les guillemets simples empêcheront l'évaluation. Les guillemets doubles vont évaluer.

# This returns three distinct elements, like an array.
[user@work 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.
[user@work test]$ echo='echo *.txt'; echo "$($echo)"
A.txt B.txt C.txt

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

Vous pouvez utiliser des guillemets simples entre guillemets doubles et des guillemets doubles entre guillemets doubles, mais des guillemets doubles entre guillemets simples ne devrait pas être fait (sans leur échapper) ne seront pas évalués, ils seront interprétés littéralement. Les guillemets simples entre guillemets simples ne doivent pas être utilisés (sans les échapper).

Vous devez acquérir une compréhension approfondie des citations pour utiliser efficacement Bash. Très important!

En règle générale, je n'utilise pas de guillemets si je veux que Bash développe quelque chose en éléments (comme un tableau), j'utilise des guillemets simples pour les chaînes littérales qui ne doivent pas être modifiées et j'utilise généreusement les guillemets doubles pour les variables. qui sont susceptibles de renvoyer n'importe quel type de chaîne. Cela permet de garantir que les espaces et les caractères spéciaux seront préservés.

23
AsymLabs