Différence entre les guillemets simples et doubles en Bash

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

357
demandé sur ghoti 2011-07-14 21:55:27

5 réponses

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 Guillemets

contenant des caractères entre guillemets ( ' ) conserve la valeur littérale de chaque caractère dans les citations. Une simple citation ne peut pas se produire entre des citations simples, même si elle est précédée d'un antislash.

3.1.2.3 Doubles Guillemets

contenant les caractères entre guillemets ( " ) préserve la valeur littérale de tous les caractères dans les guillemets, à l'exception de $ , ` , \ , et, lorsque l'extension de l'histoire est activée, ! . Les caractères $ et ` conservent leur signification particulière dans les guillemets doubles (voir extensions de la coque ). Le backslash conserve sa signification particulière seulement lorsqu'il est suivi par l'un des caractères suivants:: $ , ` , " , \ , ou newline. Dans les guillemets doubles, les antislashs qui sont suivis par l'un de ces caractères sont supprimés. Les antislashs qui précèdent des caractères sans signification particulière ne sont pas modifiés. Un double devis peut être cité dans un double guillemets en le précédant d'un antislash. Si cette option est activée, l'extension de l'historique sera effectuée à moins qu'un ! apparaissant entre guillemets ne soit échappé en utilisant un antislash. Le revers précédant le ! n'est pas enlevé.

les paramètres spéciaux * et @ ont un sens particulier lorsqu'ils sont indiqués entre guillemets (voir Shell Parameter Expansion ).

372
répondu Adam Batkin 2018-04-20 15:44:37

si vous faites référence à ce qui se passe quand 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, ce

#!/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
184
répondu likso 2013-10-11 02:10:26

Le accepté de répondre est grande. Je fais un tableau qui permet de comprendre rapidement le sujet. L'explication implique une variable simple a ainsi qu'un tableau indexé arr .

Si on

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

puis echo l'expression dans la deuxième colonne, on obtient le résultat / comportement indiqué dans la troisième colonne. La quatriè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 aussi:

135
répondu codeforester 2018-06-20 18:13:40

D'autres ont très bien expliqué et veulent juste donner avec des exemples simples.

Single guillemets peut être utilisé autour du texte pour empêcher le shell d'interpréter des caractères spéciaux. Les signes Dollar, les espaces, les ampersands, les astérisques et autres caractères spéciaux sont tous ignorés lorsqu'ils sont inclus dans des 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és à l'intérieur des guillemets simples est un guillemet simple.

double guillemets agir de la même façon que les guillemets simples, sauf que les guillemets doubles permettent toujours à l'interpréteur de commandes d'interpréter les signes de dollars, les guillemets arrières et les tirets arrières. On sait déjà que les antislashs empêchent l'interprétation d'un seul caractère spécial. Cela peut être utile à l'intérieur de guillemets doubles si un signe dollar doit être utilisé comme texte au lieu d'une variable. Il permet également d'échapper aux doubles guillemets ils ne sont donc pas interprétés comme la fin d'une chaîne Citée.

$ 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 aussi remarquer que l'apostrophe, qui serait autrement interprétée comme le début d'une chaîne de caractères Citée, est ignorée dans les doubles guillemets. Les Variables, cependant, sont interprétées et substituées avec leurs valeurs entre guillemets.

$ echo "The current Oracle SID is $ORACLE_SID"

il donnera ceci:

The current Oracle SID is test

Retour citations sont entièrement à la différence des guillemets simples ou doubles. Au lieu d'être utilisé pour empêcher l'interprétation de caractères spéciaux, les guillemets arrières forcent en fait l'exécution des commandes qu'ils contiennent. Après que les commandes ci-jointes sont exécutées, leur sortie est substituée à la place des guillemets dans la ligne originale. Ce sera plus clair avec un exemple.

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

il donnera ceci:

Monday, September 28, 2015 
2
répondu Sree 2018-07-14 18:21:33

il y a une distinction claire entre l'usage de ' ' et " " .

quand ' ' est utilisé autour de n'importe quoi, il n'y a pas de" transformation ou de traduction " fait. Il est imprimé tel qu'il est.

avec " " , quoi qu'il entoure, est" traduit ou transformé " en sa valeur.

par traduction / transformation je veux dire les suivants: Rien dans les apostrophes ne sera pas "traduit" à leurs valeurs. Ils seront pris comme ils sont entre guillemets. Exemple: a=23 , puis echo '$a' produiront $a sur la sortie standard. Alors que echo "$a" produira 23 sur la production standard.

0
répondu a_ran 2018-08-21 12:42:43