2011-09-16 7 views
55

Entiendo el operador de dos puntos en bash que actúa como a null, y sé que se usa en parameter expansion, y también se usa de otras maneras, pero ¿alguien puede explicar esto? :

: ${SOMETHING='value'} 

Desde la experimentación sé que esto establece la variable de entorno $SOMETHING-'value' pero ¿por qué?

"Justo porque lo hace" es una respuesta válida, pero luego, por favor, remítame a la documentación correspondiente (que no puedo encontrar) o sería útil un nombre apropiado para este uso. Sin embargo, espero que haya una explicación más esclarecedora.

+1

Tenga en cuenta que el ':' existe incorporada en el shell Bourne y KSH, así como bash. – ghoti

Respuesta

60

La expresión establece ALGO a value si no está ya establecida. Este es un operador útil para tener en muchas situaciones. Sin embargo, también devuelve el valor asignado, por lo que si usted simplemente ejecutado

${SOMETHING='value'} 

entonces su cáscara tratarían de invocar el comando value. Esto podría o no hacer algo no deseado; al menos lanzaría un mensaje "value: command not found".

Para evitar esto, puede utilizar el : no-op, que evalúa su argumento y luego lo tira, en lugar de ejecutarlo.

+9

El comando ':' incorporado está documentado [aquí] (http://www.gnu.org/software/bash/manual/bashref.html#Bourne-Shell-Builtins). También es un [estándar POSIX] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#colon). –

+3

También se explica [aquí] (http://www.tldp.org/LDP/abs/html/special-chars.html#COLON0REF). –

5

se explica aquí: http://tldp.org/LDP/abs/html/parameter-substitution.html

Si el parámetro no se establece, se establece por defecto.

Ambas formas son casi equivalentes. El: hace la diferencia solo cuando el parámetro $ ha sido declarado y es nulo, [1] como se indicó anteriormente.

echo ${var=abc} # abc 
echo ${var=xyz} # abc 
# $var had already been set to abc, so it did not change. 
+2

Sugeriría http://wiki.bash-hackers.org/syntax/pe o http://mywiki.wooledge.org/BashFAQ/073 (y sus enlaces) como mejores referencias que el ABS (que está crónicamente infrautilizado y tiene una tendencia a mostrar malas prácticas en sus ejemplos). –

Cuestiones relacionadas