Différence entre guillemets simples et doubles dans Bash

Dans Bash, quelles sont les différences entre les guillemets simples ( '' ) et les guillemets ( "" )?

Les guillemets simples n’interpolent rien, mais les guillemets doubles le feront. Par exemple: variables, backticks, certains \ escapes, etc.

Exemple:

 $ echo "$(echo "upg")" upg $ echo '$(echo "upg")' $(echo "upg") 

Le manuel de Bash a ceci à dire:

3.1.2.2 Citations uniques

Enfermer des caractères entre guillemets simples ( ' ) préserve la valeur littérale de chaque caractère dans les guillemets. Une simple citation ne peut pas se produire entre des guillemets simples, même si elle est précédée d’une barre oblique inverse.

3.1.2.3 Double devis

Enfermer des caractères entre guillemets ( " ) préserve la valeur littérale de tous les caractères à l’intérieur des guillemets, à l’exception de $ , ` , \ et, lorsque l’extension est activée, ! . Les caractères $ et ` conservent leur signification citations (voir Extensions de shell ) La barre oblique inverse conserve sa signification particulière uniquement lorsqu’elle est suivie par l’un des caractères suivants: $ , ` , " , \ ou newline. Dans les guillemets doubles, les barres obliques inverses suivies d’un de ces caractères sont supprimées. Les barres obliques inverses précédant les caractères sans signification particulière ne sont pas modifiées. Une citation double peut être citée entre guillemets en la précédant d’une barre oblique inverse. Si activé, l’expansion de l’historique sera effectuée à moins qu’un ! apparaissant entre guillemets est échappé en utilisant une barre oblique inverse. Le backslash précédant le ! n’est pas supprimé

Les parameters spéciaux * et @ ont une signification particulière lorsqu’ils sont entre guillemets (voir Extension des parameters de shell ).

Si vous faites référence à ce qui se passe lorsque vous faites écho à quelque chose, les guillemets simples feront littéralement écho à ce que vous avez entre eux, tandis que les guillemets doubles évalueront les variables entre eux et afficheront la valeur de la variable.

Par exemple, ceci

 #!/bin/sh MYVAR=sometext echo "double quotes gives you $MYVAR" echo 'single quotes gives you $MYVAR' 

donnera ceci:

 double quotes gives you sometext single quotes gives you $MYVAR 

La réponse acceptée est géniale. Je fais un tableau qui aide à comprendre rapidement le sujet. L’explication implique une variable simple a ainsi qu’un tableau indexé arr .

Si on fixe

 a=apple # a simple variable arr=(apple) # an indexed array with a single element 

et ensuite, echo l’expression dans la deuxième colonne, nous obtiendrions le résultat / comportement indiqué dans la troisième colonne. La quasortingème colonne explique le comportement.

  # | Expression | Result | Comments ---+-------------+-------------+-------------------------------------------------------------------- 1 | "$a" | apple | variables are expanded inside "" 2 | '$a' | $a | variables are not expanded inside '' 3 | "'$a'" | 'apple' | '' has no special meaning inside "" 4 | '"$a"' | "$a" | "" is treated literally inside '' 5 | '\'' | **invalid** | can not escape a ' within ''; use "'" or $'\'' (ANSI-C quoting) 6 | "red$arocks"| red | $arocks does not expand $a; use ${a}rocks to preserve $a 7 | "redapple$" | redapple$ | $ followed by no variable name evaluates to $ 8 | '\"' | \" | \ has no special meaning inside '' 9 | "\'" | ' | \' is interpreted inside "" 10 | "\"" | " | \" is interpreted inside "" 11 | "*" | * | glob does not work inside "" or '' 12 | "\t\n" | \t\n | \t and \n have no special meaning inside "" or ''; use ANSI-C quoting 13 | "`echo hi`" | hi | `` and $() are evaluated inside "" 14 | '`echo hi`' | `echo hi` | `` and $() are not evaluated inside '' 15 | '${arr[0]}' | ${arr[0]} | array access not possible inside '' 16 | "${arr[0]}" | apple | array access works inside "" 17 | $'$a\'' | $a' | single quotes can be escaped inside ANSI-C quoting 18 | "$'\t'" | $'\t' | ANSI quoting is not interpreted inside "" 19 | '!cmd' | !cmd | history expansion character '!' is ignored inside '' 20 | "!cmd" | cmd args | expands to the most recent command matching "cmd" ---+-------------+-------------+-------------------------------------------------------------------- 

Voir également:

  • Citation ANSI-C avec $'' – Manuel GNU Bash
  • Traduction locale avec $"" – Manuel GNU Bash
  • Une formule en trois points pour les devis

D’autres ont très bien expliqué et veulent simplement donner des exemples simples.

Des guillemets simples peuvent être utilisés autour du texte pour empêcher le shell d’interpréter des caractères spéciaux. Les signes dollar, les espaces, les esperluettes, les astérisques et autres caractères spéciaux sont tous ignorés lorsqu’ils sont placés entre guillemets simples.

 $ echo 'All sorts of things are ignored in single quotes, like $ & * ; |.' 

Il donnera ceci:

 All sorts of things are ignored in single quotes, like $ & * ; |. 

La seule chose qui ne peut pas être placée entre des guillemets simples est une citation unique.

Les guillemets doubles agissent de manière similaire aux guillemets simples, sauf que les guillemets doubles permettent toujours au shell d’interpréter les signes dollar, les guillemets et les barres obliques inverses. On sait déjà que les barres obliques inverses empêchent l’interprétation d’un seul caractère spécial. Cela peut être utile entre guillemets si un signe dollar doit être utilisé comme texte au lieu d’une variable. Il permet également d’échapper les guillemets doubles pour qu’ils ne soient pas interprétés comme la fin d’une chaîne entre guillemets.

 $ echo "Here's how we can use single ' and double \" quotes within double quotes" 

Il donnera ceci:

 Here's how we can use single ' and double " quotes within double quotes 

On peut également remarquer que l’apostrophe, qui serait autrement interprétée comme le début d’une chaîne entre guillemets, est ignorée entre guillemets. Les variables, cependant, sont interprétées et substituées par leurs valeurs entre guillemets.

 $ echo "The current Oracle SID is $ORACLE_SID" 

Il donnera ceci:

 The current Oracle SID is test 

Les guillemets sont totalement différents des guillemets simples ou doubles. Au lieu d’être utilisés pour empêcher l’interprétation de caractères spéciaux, les guillemets obligent en réalité l’exécution des commandes qu’ils contiennent. Une fois les commandes jointes exécutées, leur sortie est remplacée par les guillemets dans la ligne d’origine. Ce sera plus clair avec un exemple.

 $ today=`date '+%A, %B %d, %Y'` $ echo $today 

Il donnera ceci:

 Monday, September 28, 2015 

Il y a une distinction claire entre l’utilisation de ' ' et " " .

Lorsque ' ' est utilisé autour de quelque chose, il n’y a pas de “transformation ou traduction” effectuée. Il est imprimé tel quel.

Avec " " , tout ce qui l’entoure est “traduit ou transformé” en sa valeur.

Je veux dire par traduction / transformation: Tout ce qui se trouve entre les guillemets ne sera pas “traduit” par leurs valeurs. Ils seront pris comme ils sont à l’intérieur des guillemets. Exemple: a=23 , alors echo '$a' produira $a sur la sortie standard. Alors que echo "$a" produira 23 sur la sortie standard.