Qual é a diferença entre o arquivo grep apple e o arquivo grep “apple”?

22

Qual é a diferença entre grep apple file e grep "apple" file ? O que colocar as aspas? Ambos parecem funcionar e fazer exatamente a mesma coisa (exibir a mesma linha).

    
por John Stacen 03.10.2013 / 10:54

2 respostas

45

As aspas afetam os caracteres que seu shell considera especiais e possuem um significado sintático. No seu exemplo, isso não faz diferença porque apple não contém tais caracteres.

Mas considere outro exemplo: grep apple tree file pesquisará a palavra apple nos arquivos tree e file , enquanto grep "apple tree" file pesquisará a palavra apple tree no arquivo file . As aspas dizem bash, que o espaço da palavra em "apple tree" não inicia um novo parâmetro, mas deve fazer parte do parâmetro atual. grep apple\ tree file produziria o mesmo resultado, porque \ diz ao bash para desconsiderar o significado especial do caractere seguinte e tratá-lo literalmente.

    
por David Foerster 03.10.2013 / 11:03
23

As aspas duplas permitem a avaliação, as aspas simples evitam a avaliação, nenhuma aspas permitem a expansão do caractere curinga, quando usadas na linha de comando. Como exemplos planejados:

[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

Entender o modo como as cotações funcionam é essencial para entender o Bash. Por exemplo:

# 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)

Você pode usar aspas simples para transmitir um comando por meio de uma variável. Aspas simples impedirão a avaliação. Aspas duplas avaliarão.

# 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)

Você pode usar aspas simples entre aspas duplas e pode usar aspas duplas entre aspas duplas, mas as aspas duplas entre aspas simples não devem ser feitas (sem escapá-las) não serão avaliadas, elas serão ser interpretado literalmente. Aspas simples entre aspas simples não devem ser feitas (sem escapar delas).

Você precisará obter um entendimento completo das cotações para usar o Bash com eficiência. Muito importante!

Como regra geral, eu não uso aspas se eu quero que o Bash expanda algo em elementos (como uma matriz), eu uso aspas simples para strings literais que não devem ser alteradas, e faço uso liberal de double citações para variáveis que provavelmente retornarão qualquer tipo de string. Isso garante que os espaços e caracteres especiais sejam preservados.

    
por AsymLabs 03.10.2013 / 19:36

Tags