2011-07-14 33 views

Respuesta

312

Las comillas simples no interpolarán nada, pero las comillas dobles (por ejemplo, variables, marcadores, ciertos \ escapes, etc ...).

Ejemplo

[email protected]:~# echo "$(echo "upg")" 
upg 
[email protected]:~# echo '$(echo "upg")' 
$(echo "upg") 

El manual de Bash tiene esto que decir:

3.1.2.2 Single Quotes

Encerrar caracteres entre comillas simples (') preserva el valor literal de cada carácter dentro de las comillas. Es posible que una comilla simple no se produzca entre comillas simples, incluso cuando esté precedida por una barra diagonal inversa.

3.1.2.3 Double Quotes

personajes que encierran entre comillas dobles (") preserva el valor literal de todos los caracteres dentro de las comillas, con la excepción de $, `, \, y, cuando la expansión de historia está activado, !. Los caracteres $ y ` conservan su significado especial entre comillas dobles (consulte Shell Expansions). La barra invertida conserva su significado especial solo cuando es seguida por uno de los siguientes caracteres: $, `, ", \, o nueva línea. Dentro de las comillas dobles, se eliminan las barras invertidas que son seguidas por uno de estos caracteres. Las barras diagonales anteriores a los caracteres sin un significado especial quedan sin modificar. Una comilla doble puede citarse entre comillas dobles precediéndola con una barra diagonal inversa. Si está habilitado, la expansión del historial se realizará a menos que se escape un ! que aparece entre comillas dobles usando una barra invertida. La barra invertida que precede al ! no se elimina. Los parámetros especiales * y @ tienen un significado especial cuando están entre comillas dobles (ver Shell Parameter Expansion).

167

Si te refieres a lo que sucede cuando haces eco de algo, las comillas simples harán eco de lo que tienes entre ellas, mientras que las comillas dobles evaluarán las variables entre ellas y generarán el valor de la variable.

Por ejemplo, este

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

daré esto:

double quotes gives you sometext 
single quotes gives you $MYVAR 
87

El accepted answer es grande. Estoy haciendo una tabla que ayude a una comprensión rápida del tema. La explicación implica una variable simple a, así como una matriz indexada arr.

Si fijamos

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

y luego echo la expresión en la segunda columna, que se pueden conseguir el resultado/comportamiento se muestra en la tercera columna. La cuarta columna explica el comportamiento.

# | 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 | '!cmd'  | !cmd  | history expansion character '!' is ignored inside single quotes 
19 | "!cmd"  | cmd args | expands to the most recent command matching "cmd" 
---+-------------+-------------+-------------------------------------------------------------------- 

Ver también:

+2

Esa tabla es una respuesta a muchas preguntas sobre [Stackoverflow] (https://stackoverflow.com) . – C0deDaedalus

+1

La respuesta aceptada dice al final 'Los parámetros especiales * y @ tienen un significado especial cuando están entre comillas dobles ', entonces, ¿cómo es que' "*" 'da como resultado' * '? –

Cuestiones relacionadas