web-dev-qa-db-fra.com

Quand utiliser une citation unique, double citation dans Grep?

Tout en essayant de rechercher un modèle simple "Bonjour" dans un fichier, toutes les formes suivantes du travail de GREP:

  • grep hello file1
  • grep 'hello' file1
  • grep "bonjour" fichier1

Existe-t-il un cas particulier où l'une des formes ci-dessus fonctionne mais d'autres ne le font pas. Cela fait-il une différence si j'utilise un à la place d'une autre?

20
TheLameProgrammer

Ceci est effectivement dépendant de votre coquille. Les citations (soit du genre) sont principalement destinées à traiter avec des espaces. Par exemple, les éléments suivants:

grep hello world file1

recherchera le mot "bonjour" dans les fichiers appelés "World" et "File1", tandis que

grep "hello world" file1

recherchera "Hello World" dans File1.

Le choix entre des guillemets simples ou doubles n'est important que si la chaîne de recherche contient des variables ou d'autres éléments que vous prévoyez être évalués. Avec des guillemets simples, la chaîne est prise littéralement et aucune expansion n'a lieu. Avec des guillemets doubles, des variables sont élargies. Par exemple (avec une coque dérivée de Bourne telle que Bash ou ZSH):

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

Le premier grep va chercher la chaîne littérale "$ Var1" dans File1. La seconde élargira la variable "$ Var" et recherchera la chaîne "Serverfault" dans File1.

25
James Sneeringer

James est correct, mais d'ajouter quelques données supplémentaires, je pense que la meilleure façon de penser est comme des arguments à la commande: avez-vous l'intention de "Bonjour" et "World" d'être deux arguments ou "Hello World" d'être un argument.

En outre, les doubles quantités permettent d'interpréter plus que des variables. Ce qui dépend exactement de votre coquille, mais vérifiez dans l'expansion de l'historique, l'expansion de la corset et l'expansion du nom de fichier.

Il est également important de noter qu'il y a des instances dans lesquelles vous devez utiliser les deux types de guillemets dans un seul argument. N'oubliez pas que les arguments (par défaut) sont délimités par WhitSpace, donc si vous ne laissez aucun espace, vous spécifiez toujours le même argument.

Le mécanisme de la plupart des coquilles ne permet aucun caractère spécial, ce qui signifie que toute instance d'un autre siteote, même si elle semble être échappée, met fin à la citation. Il est donc impossible de passer une chaîne avec une seulequote à l'intérieur d'une chaîne à une seule vue, et vous devez utiliser des doubles qualités. Cela peut être une douleur lorsque vous voulez passer un argument contenant des séloques et quelque chose qui serait interprété, mais vous ne voulez pas être. Par exemple, si vous vouliez passer la chaîne littérale "` "$ var" est une variable ", vous devez le faire de cette façon:

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

C'est en fait une concaténation de trois cordes échappées:

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

ou, avec les citations supprimées:

'
$VAR
' is a variable

En fait, avec la plupart des coquillages, vous pourriez aussi le faire de cette façon:

"'\$VAR' is a variable"

où la barre oblique inverse ("\ ") Indique à la coquille d'accepter littéralement le caractère suivant et ne pas faire une expansion à ce sujet.

Mais il y a des cas où vous finissez par avoir à le faire la manière multi-stress-concaténation, pas que je puisse réellement venir avec un exemple en ce moment.

7
wfaulk