Diferença entre “” e '' no bash

3

Estou tentando descobrir qual é a diferença entre "" e "".

Quando eu os uso com echo , ambos fornecem o mesmo resultado,

sps@sps-Inspiron-N5110:~$ echo Hello    world
Hello world
sps@sps-Inspiron-N5110:~$ echo "Hello   world"
Hello   world
sps@sps-Inspiron-N5110:~$ echo 'Hello   world'
Hello   world
sps@sps-Inspiron-N5110:~$ 

Existe alguma situação específica em que precisamos usar um ou outro?

Obrigado.

    
por sps 05.04.2015 / 00:35

2 respostas

4

Em bash (interativa padrão do Ubuntu shell ), tudo seguindo uma aspas abertas ( ' ) é citado literalmente , até o próximo ' , que é considerado como a cotação de fechamento. Em contraste, vários tipos de expansões de shell são executados dentro de aspas duplas ( " ).

  • Expansão de parâmetro (com $... ou ${...} ):

    ek@Io:~$ echo '$HOME ${USER^^*} ${SHELL%%+([[:alnum:]])}'
    $HOME ${USER^^*} ${SHELL%%+([[:alnum:]])}
    ek@Io:~$ echo "$HOME ${USER^^*} ${SHELL%%+([[:alnum:]])}"
    /home/ek EK /bin/
    

    Este é um caso de uso comum para " quotes em scripts de shell. Em particular, você pode ter visto ciclos que iteram por meio de nomes de arquivos, expandindo uma variável dentro de aspas duplas, de modo que seja expandida, mas não tem seu valor dividido em palavras separadas. Por exemplo, um comando como este pode ajudar-me a controlar as coisas enquanto preparo muitos arquivos de mídia para movimentação:

    ek@Io:~$ for d in to\ *; do ls -ld "$d"; du -sh "$d"; done
    drwxr-x--- 856 ek ek 32768 Mar 29 10:47 to Albums (partial)
    308G    to Albums (partial)
    drwxrwxr-x 1191 ek ek 40960 Mar 11 12:56 to Books
    21G to Books
    
  • Substituição de comandos (com $(...) ou '...' ) e expansão aritmética (com $((...)) ):

    ek@Io:~$ echo '$(date)      'uname -r'      $((2+2))'
    $(date)      'uname -r'      $((2+2))
    ek@Io:~$ echo "$(date)      'uname -r'      $((2+2))"
    Sat Apr  4 20:42:37 EDT 2015      3.19.0-11-generic      4
    
  • Escape de caracteres únicos com \ é suportado e pode ser útil em " aspas, mas não é suportado (e geralmente seria inútil) nas citações mais simples de ' :

    ek@Io:~$ echo '$HOME $HOME \\'
    $HOME $HOME \\
    ek@Io:~$ echo "$HOME $HOME \\"
    /home/ek $HOME \
    
  • Expansão do histórico com ! (se ativado, o que geralmente é quando você está usando o shell interativamente):

    ek@Io:~$ # this is just a comment (but I could run a command here)
    ek@Io:~$ echo '!!'
    !!
    ek@Io:~$ # this is just another comment (but could be another command)
    ek@Io:~$ echo "!!"
    echo "# this is just another comment (but could be another command)"
    # this is just another comment (but could be another command)
    

Além disso, um dos motivos mais comuns para usar aspas duplas é citar de forma fácil e intuitiva o texto contendo aspas simples (já que ' não tem nenhum significado especial, dentro de " quotes):

ek@Io:~$ echo "We'll have the dog's fleas gone soon, you'll see."
We'll have the dog's fleas gone soon, you'll see.

Por fim, embora não seja possível escapar de um texto ' dentro de ' , você pode obter o mesmo resultado finalizando com ' , usando um escape ' ( \' ), e continuando citando com ' :

ek@Io:~$ echo '"My $PATH ain'\''t what it used to be," said the stevedore'\''s apprentice.'
"My $PATH ain't what it used to be," said the stevedore's apprentice.
    
por Eliah Kagan 05.04.2015 / 03:14
0
O link

stackoverflow postado acima por bodhi.zazen responde a essa pergunta.

Abaixo está uma situtation onde faz diferença.

sps@sps-Inspiron-N5110:~$ echo "Hello, I have only $((3+5)) $ in my account"
Hello, I have only 8 $ in my account
sps@sps-Inspiron-N5110:~$ echo 'Hello, I have only $((3+5)) $ in my account'
Hello, I have only $((3+5)) $ in my account
sps@sps-Inspiron-N5110:~$ 

Publicando esta resposta, apenas para informar aos outros que já tenho a resposta. (Eu tinha postado essa pergunta.)

Obrigado.

    
por sps 05.04.2015 / 00:52