web-dev-qa-db-fra.com

Différences entre les guillemets "", les guillemets simples '' et les backticks "sur la ligne de commande?

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
42
NES

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

  • echo "$foo" renvoie unamename__, en substituant des variables dans le texte.
    • Pour un caractère littéral $ dans les guillemets ", utilisez \$; pour un littéral ", utilisez \".
  • echo '$foo' renvoie $foo, la chaîne exacte.
    • Même ' ne peut pas être échappé en tant que \' à l'intérieur de ' citations. Mais vous pouvez utiliser 'foo'\''bar'.
  • echo `$foo` génère Linuxname__, en exécutant le contenu de la variable et echoen l’imprimant.
43
shellholic

Ceci est très bien expliqué dans le section correspondante du manuel 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 souhaitez 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 (espaces par exemple), mais autorisent les variables et les caractères spéciaux. développé/interprété correctement.

11
terdon

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 conservée, à l'exception du signe dollar ($), des backticks (guillemets simples en arrière, ``) et de la barre oblique inverse (\).

Lorsqu'il est enfermé dans des symboles antérieurs (``), le shell interprète quelque chose comme signifiant "le résultat 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.

références:

5
aneeshep
echo '$HOME' is "$HOME"

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

3
ubfan1

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" générera: Hello my name is NESS

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

  • En utilisant l'exemple ci-dessus, il va générer 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.

2
Luis Alvarado

Les guillemets simples renferment une valeur à prendre littéralement: tous les types d'expansion sont supprimés. Habituellement utilisé si la valeur comprend ou peut inclure un espace (espace, tabulation, nouvelle ligne) ou des caractères spéciaux ($, \, `) que l'utilisateur ne souhaite pas développer/traiter spécialement par le shell.

Les guillemets doubles contiennent 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 nouveaux shells permettent d'utiliser $(...) à la place 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)
1
BillThor