web-dev-qa-db-fra.com

Différence entre "" et '' en bash

J'essaie de comprendre quelle est la différence entre "" et "".

Quand je les utilise avec echo ils donnent le même résultat,

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-t-il une situation spécifique dans laquelle nous devons utiliser l'un ou l'autre?

Merci.

3
sps

Dans bash (interactif par défaut d'Ubuntu Shell ), tout ce qui suit un guillemet simple ouvert (') est cité littéralement , jusqu'au prochain ' qui est pris comme la citation de clôture. En revanche, plusieurs types d'expansion de shell sont effectués à l'intérieur de guillemets (").

  • expansion des paramètres (avec $... ou ${...}):

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

    Ceci est un cas d'utilisation courant pour les guillemets " dans les scripts Shell. En particulier, vous avez peut-être vu boucles que itérer dans les noms de fichiers, en développant une variable entre guillemets doubles de sorte qu'il le fasse en développant mais n'a pas sa valeur divisée en mots séparés. Par exemple, une commande comme celle-ci pourrait m'aider à garder une trace de tout en préparant de nombreux fichiers multimédias pour le déplacement:

    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
    
  • substitution de commande (avec $(...) ou `...`) et développement arithmétique (avec $((...))):

    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
    
  • L'échappement de caractères simples avec \ est pris en charge et peut être pratique entre guillemets ", mais n'est pas pris en charge (et serait généralement inutile) entre les guillemets simples ':

    ek@Io:~$ echo '$HOME \$HOME \\\\'
    $HOME \$HOME \\\\
    ek@Io:~$ echo "$HOME \$HOME \\\\"
    /home/ek $HOME \\
    
  • Extension de l'historique avec ! (s'il est activé, comme c'est généralement le cas lorsque vous utilisez le shell de manière interactive):

    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)
    

De plus, l'une des raisons les plus courantes d'utiliser des guillemets doubles est de citer facilement et intuitivement du texte contenant des guillemets simples (puisqu'un ' n'a aucune signification particulière, entre " 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.

Enfin, bien que vous ne puissiez pas échapper un ' à l'intérieur de '- texte cité, vous pouvez obtenir le même résultat en finissant en citant avec ', en utilisant un ' (\') échappé ), et en reprenant la cotation avec ':

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.
5
Eliah Kagan

le lien stackoverflow posté ci-dessus par bodhi.zazen répond à cette question.

Ci-dessous une situation où cela fait la différence.

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:~$ 

Afficher cette réponse, juste pour que les autres sachent que j'ai déjà la réponse. (J'avais posté cette question.)

Merci.

0
sps