2010-12-14 35 views
82

$ {parameter: = word} Asignar valores predeterminados. Si el parámetro está desactivado o es nulo, la expansión de la palabra se asigna al parámetro . El valor del parámetro es luego sustituido. Los parámetros posicionales y los parámetros especiales no se pueden asignar de esta manera.bash asignar el valor predeterminado

pensé que podría utilizar esta función para anotar ${LONG_VARIABLE_NAME:=hello} en lugar de la más larga LONG_VARIABLE_NAME=${LONG_VARIABLE_NAME:-hello}, pero ahora Bash también intenta ejecutar 'hola' y que da la orden de que no se encuentra. ¿Alguna forma de evitar eso? ¿O tendré que apegarme a esto último? ¿Alguien puede dar un ejemplo donde la asignación predeterminada es realmente útil?

+10

Al citar texto, es útil incluir un enlace a la fuente. –

Respuesta

137

utilizar dos puntos:

: ${A:=hello} 

El colon es un comando nula de que no hace nada y hace caso omiso de sus argumentos. Está integrado en bash, por lo que no se crea un nuevo proceso.

+58

No puedo evitar observar que ': $ {A: = hello}' es exactamente tan larga como 'A = $ {A: -hello}'.También parece que este último es un poco menos esotérico y su intención es más clara. Usar ':', que es básicamente no-op, parece kludgy en comparación con la forma en que el OP lo estaba haciendo antes. –

+0

@DanMoulding: no creo que ninguna de las soluciones sea satisfactoria. No me gusta el tartamudeo de la segunda forma, así que ligeramente prefiero una serie de líneas ':' al comienzo de una secuencia de comandos para establecer los valores predeterminados. (también, tienen la misma longitud para los nombres de variable de un solo carácter). – camh

+2

@camh: De acuerdo. Puedo ver dónde, si tenía muchas variables para inicializar a valores predeterminados y tienen nombres largos, el enfoque ':' sería preferible, tanto para escribir como para leer. Sí, esto parece ser un área donde Bash podría usar una pequeña mejora. –

14

La expansión del parámetro de valor predeterminado suele ser útil en las secuencias de comandos de compilación como en el siguiente ejemplo. Si el usuario sólo llama a la secuencia de comandos como está, Perl no será construido en. El usuario tiene que establecer explícitamente WITH_PERL a un valor distinto de "no" a tenerlo construido en.

$ cat defvar.sh 
#!/bin/bash 

WITH_PERL=${WITH_PERL:-no} 

if [[ "$WITH_PERL" != no ]]; then 
    echo "building with perl" 
    # ./configure --enable=perl 
else 
    echo "not building with perl" 
    # ./configure 
fi 

Construir sin Perl

$ ./defvar.sh 
not building with perl 

Construir con Perl

$ WITH_PERL=yes ./defvar.sh 
building with perl 
+0

gracias por su respuesta. – zedoo

31

por favor mira http://www.tldp.org/LDP/abs/html/parameter-substitution.html para ejemplos

${parameter-default}, ${parameter:-default} 

Si el parámetro no está establecido, utilice el valor predeterminado. Después de la llamada, el parámetro aún no está configurado.
Ambas formas son casi equivalentes. El : extra hace una diferencia solo cuando el parámetro ha sido declarado, pero es nulo.

unset EGGS 
echo 1 ${EGGS-spam} # 1 spam 
echo 2 ${EGGS:-spam} # 2 spam 

EGGS= 
echo 3 ${EGGS-spam} # 3 
echo 4 ${EGGS:-spam} # 4 spam 

EGGS=cheese 
echo 5 ${EGGS-spam} # 5 cheese 
echo 6 ${EGGS:-spam} # 6 cheese 

${parameter=default}, ${parameter:=default} 

Si el parámetro no se establece, el valor del parámetro establecido como predeterminado.
Ambas formas son casi equivalentes. El: hace una diferencia únicamente cuando el parámetro ha sido declarado y es nulo

# sets variable without needing to reassign 
# colons suppress attempting to run the string 
unset EGGS 
: ${EGGS=spam} 
echo 1 $EGGS  # 1 spam 
unset EGGS 
: ${EGGS:=spam} 
echo 2 $EGGS  # 2 spam 

EGGS= 
: ${EGGS=spam} 
echo 3 $EGGS  # 3  (set, but blank -> leaves alone) 
EGGS= 
: ${EGGS:=spam} 
echo 4 $EGGS  # 4 spam 

EGGS=cheese 
: ${EGGS:=spam} 
echo 5 $EGGS  # 5 cheese 
EGGS=cheese 
: ${EGGS=spam} 
echo 6 $EGGS  # 6 cheese 

${parameter+alt_value}, ${parameter:+alt_value} 

Si conjunto de parámetros, el uso alt_value, el uso de otra cadena nula. Después de la llamada, el valor del parámetro no cambió.
Ambas formas son casi equivalentes. El: hace una diferencia solo cuando el parámetro ha sido declarado y es nulo

unset EGGS 
echo 1 ${EGGS+spam} # 1 
echo 2 ${EGGS:+spam} # 2 

EGGS= 
echo 3 ${EGGS+spam} # 3 spam 
echo 4 ${EGGS:+spam} # 4 

EGGS=cheese 
echo 5 ${EGGS+spam} # 5 spam 
echo 6 ${EGGS:+spam} # 6 spam 
+2

esto no es extremadamente claro, desafortunadamente :( –

Cuestiones relacionadas