Différences entre les guillemets doubles "", les guillemets simples "" et les guillemets simples "en ligne de commande?

43

Je vois souvent des tutoriels sur le Web ou des publications sur ce site qui utilisent beaucoup les caractères suivants sur la ligne de commande. Il semble souvent qu'ils soient utilisés à des fins similaires. Quelles sont les différences entre eux lorsqu'ils sont utilisés sur la ligne de commande ou pour la programmation shell? Dans quel but dois-je utiliser lequel?

" " double quotes

' ' single quotes

` ` backticks
NDA
la source

Réponses:

43

Par exemple, considérons que la variable foocontient uname( foo=uname).

  • echo "$foo"sorties uname, en substituant des variables dans le texte.
    • Pour un $caractère littéral entre "guillemets, utilisez \$; pour un littéral ", utilisez \".
  • echo '$foo'sorties $foo, la chaîne exacte.
    • Même 'ne peuvent pas être échappés comme des citations à l' \'intérieur '. Mais vous pouvez utiliser 'foo'\''bar'.
  • echo `$foo`sorties Linux, en exécutant le contenu de la variable et en l’ echoimprimant.
shellholic
la source
\est toujours traité littéralement lorsqu'il est mis entre guillemets, même s'il précède un '. Après une ouverture ', la suivante 'est toujours interprétée comme le dernier devis. Vous 'pouvez obtenir quelque chose comme citer une chaîne entre guillemets simples en mettant fin à la citation, en s'échappant 'individuellement et en recommençant. Autrement dit, même si \'cela ne fonctionne pas entre les 'personnages qui ouvrent et ceux qui font la fermeture , '\''ça fonctionne. (Voir la correction de Gilles à l'un de mes messages quand j'avais commis la même erreur pour plus de détails.)
Eliah Kagan
11

Ceci est très bien expliqué dans la section correspondante du manuel de bash. En bref, tout ce qui est entre guillemets simples est interprété littéralement. Donc, par exemple:

$ echo '$SHELL'
$SHELL
$ echo '{1..3}'
{1..3}

Comparez cela aux versions non citées:

$ echo $SHELL
/bin/bash
$ echo {1..3}
1 2 3

Les guillemets doubles permettent une expansion variable (aussi l'expansion de l'historique et quelques autres choses). Fondamentalement, vous les utilisez lorsque vous avez affaire à quelque chose que vous voulez voir étendu. Par exemple:

$ echo "$SHELL"
/bin/bash
$ echo "!!"
echo "echo "$SHELL""
echo /bin/bash

En d'autres termes, les guillemets simples protègent complètement une chaîne du shell tandis que les guillemets doubles protègent certaines choses (les espaces, par exemple), mais permettent aux variables et aux caractères spéciaux d'être développés / interprétés correctement.

terdon
la source
1
Vous ne savez pas si le PO a été modifié après coup, mais cette réponse ne mentionne pas les backticks?
Alexander Mills
5

Les guillemets simples ( '') sont utilisés pour conserver la valeur littérale de chaque caractère compris entre les guillemets.

Avec des guillemets doubles ( ""), la valeur littérale de tous les caractères inclus est préservée, à l'exception du signe dollar ( $), des backticks (guillemets simples en arrière ``) et de la barre oblique inversée ( \).

Lorsqu'il est enfermé dans des symboles antérieurs ( ``), le shell interprète le terme "sortie de la commande à l'intérieur des symboles antérieurs". Ceci est appelé "substitution de commande", car la sortie de la commande est substituée à la commande elle-même.

les références:

aneeshep
la source
3
echo '$HOME' is "$HOME"

Les guillemets simples empêchent le développement de variables, alors que les guillemets doubles le permettent.

ubfan1
la source
2

Je parle simplement en général mais:

""- Utilisé pour traiter certaines informations à l'intérieur d'eux avant la sortie. (Comme en PHP.)

  • Par exemple: name=NESS; echo "Hello my name is $name"affichera:Hello my name is NESS

''- Utilisé pour afficher la sortie telle quelle. (Également comme en PHP.)

  • En utilisant l'exemple ci-dessus, il affichera Hello my name is $name

Ainsi, la différence entre les guillemets simples et doubles réside dans le fait que les guillemets doubles traitent la variable et affichent la valeur, tandis que les guillemets simples indiquent le nom de la variable sans traitement.

`` - Utilisé pour citer des commandes qui sont ensuite assignées à une autre variable.

Luis Alvarado
la source
1

Les guillemets simples renferment une valeur à prendre littéralement: tous les types d'expansion sont supprimés. Habituellement utilisé si la valeur contient ou peut contenir un espace blanc (espace, tabulation, nouvelle ligne), ou des caractères spéciaux ( $, \, `) que l'utilisateur ne veut pas être élargi / traité spécialement par la coquille.

Les guillemets doubles renferment une valeur qui comportera des variables et le remplacement des caractères. Obligatoire lorsque la sortie peut contenir des espaces et doit être affectée en tant que valeur unique.

Les guillemets arrières renferment une commande dont les résultats sont recherchés en tant que valeur. Les nouvelles coquilles permettent l’utilisation $(...)de `...`. Je préfère la nouvelle méthode.

Le code suivant peut aider à comprendre ce qui se passe.

CMD = 'ls.'
echo sq: $ CMD
set $ CMD
echo raw 1: 1 $
echo raw: $ *
set "$ CMD"
echo dq: 1 $
echo bq: `$ CMD`
echo new: $ ($ CMD)
BillThor
la source