Quando usar aspas simples, aspas duplas no grep?

20

Ao tentar procurar um padrão simples "olá" em um arquivo, todas as seguintes formas de grep funcionam:

  • grep olá arquivo1
  • grep 'olá' file1
  • grep "olá" file1

Existe um caso específico em que um dos formulários acima funciona, mas outros não. Faz alguma diferença se eu usar um no lugar do outro?


fonte

Respostas:

25

Na verdade, isso depende do seu shell. As cotações (de qualquer tipo) destinam-se principalmente a lidar com espaços em branco. Por exemplo, o seguinte:

grep hello world file1

procurará a palavra "olá" nos arquivos chamados "mundo" e "arquivo1", enquanto

grep "hello world" file1

procurará "olá mundo" no arquivo1.

A escolha entre aspas simples ou duplas é importante apenas se a cadeia de pesquisa contiver variáveis ​​ou outros itens que você espera que sejam avaliados. Com aspas simples, a sequência é tomada literalmente e nenhuma expansão ocorre. Com aspas duplas, as variáveis ​​são expandidas. Por exemplo (com um shell derivado de Bourne, como Bash ou ZSH):

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

O primeiro grepprocurará a string literal "$ VAR1" no arquivo1. O segundo expandirá a variável "$ VAR" e procurará a string "serverfault" no arquivo1.

James Sneeringer
fonte
O ponto principal a ser observado é que, na pergunta original, o grep está realmente recebendo os mesmos argumentos sempre.
precisa saber é o seguinte
2
Tenha cuidado lá. $é final de linha em uma expressão regular; portanto $VAR1, nunca deve realmente corresponder a nada. Acontece que funciona no GNU grep, mas eu ainda não contaria com esse comportamento. Você precisaria \$VAR1corresponder com segurança a string literal. (E você precisa de barras invertidas extras se isso é entre aspas.)
Steven Pritchard
7

James está correto, mas para adicionar mais alguns dados, acho que a melhor maneira de pensar sobre isso é como argumentos para o comando: você pretende que "olá" e "mundo" sejam dois argumentos ou "olá mundo" seja um argumento.

Além disso, aspas duplas permitem a interpretação de mais do que apenas variáveis. Exatamente o que depende do seu shell, mas verifique o histórico de expansão, expansão de chaves e expansão de nome de arquivo.

Também é importante observar que há alguns casos em que você precisa usar os dois tipos de aspas em um único argumento. Lembre-se de que os argumentos (por padrão) são delimitados por espaços em branco; portanto, se você não deixar espaço, ainda estará especificando o mesmo argumento.

O mecanismo de citação única da maioria dos shells não permite caracteres especiais, o que significa que qualquer instância de outra citação única, mesmo que pareça escapar, termina a citação. Portanto, é impossível passar uma sequência com uma citação única dentro de uma sequência de citação única, e você deve usar aspas duplas. Isso pode ser um problema quando você deseja passar um argumento que contém aspas simples e algo que seria interpretado, mas não deseja. Por exemplo, se você deseja passar a string literal "'$ VAR' é uma variável", é necessário fazer o seguinte:

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

Na verdade, é uma concatenação de três strings com escape de aspas:

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

ou, com as aspas removidas:

'
$VAR
' is a variable

Na verdade, com a maioria das conchas, você também pode fazer o seguinte:

"'\$VAR' is a variable"

onde a barra invertida (" \") diz ao shell para aceitar o seguinte caractere literalmente e não fazer nenhuma expansão nele.

Mas há alguns casos em que você acaba fazendo isso da maneira de concatenação de várias cadeias, não que eu possa realmente dar um exemplo agora.

wfaulk
fonte