2010-01-06 20 views
357

Tengo un montón de pruebas en variables en un script de shell bash (3.00) donde si la variable no está establecida, entonces asigna un valor predeterminado, por ejemplo:Asignar valores predeterminados a variables de shell con un solo comando en bash

if [ -z "${VARIABLE}" ]; then 
    FOO='default' 
else 
    FOO=${VARIABLE} 
fi 

Creo recordar que hay un poco de sintaxis para hacer esto en una sola línea, algo parecido a un operador ternario, por ejemplo:

FOO=${ ${VARIABLE} : 'default' } 

(aunque sé que no va a funcionar ...)

¿Estoy loco o existe algo así?

+1

sección de expansión Shell parámetro de la referencia cáscara del golpe es un buen lugar de partida: https://tiswww.case.edu/php/chet/ bash/bashref.html # Shell-Expansions. –

Respuesta

618

muy cerca de lo que usted envió, en realidad:

FOO=${VARIABLE:-default} # If variable not set, use default. 

O, que asignará a defaultVARIABLE así:

FOO=${VARIABLE:=default} # If variable not set, set it to default. 
+24

Si quisiera encontrar esto en la documentación, ¿para qué serviría un google? Buscar en Google con caracteres especiales como $ {: -} no es muy fácil. –

+14

Respondiendo a solarmist: "default de la asignación variable bash" déjame ir a esta página, y buscando en la página de manual de bash con 'variable ass' me llevo a la sección correcta después de ~ five 'next' – Mooshu

+29

Ten en cuenta que es [* not * bash- specific] (http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_02) y funcionará con toda la familia de shell. Es seguro para scripts genéricos. –

161

Para argumentos de línea de comandos:

VARIABLE=${1:-DEFAULTVALUE}  

que asigna a VARIABLE el valor de la primera argumento pasado a la secuencia de comandos o el valor de DEFAULTVALUE si se pasa ningún argumento de ese tipo.

21

ver here bajo 3.5.3 (expansión de parámetros shell)

así que en su caso

${VARIABLE:−default} 
11

Luego está la manera de expresar su 'si' construir más concisamente:

FOO='default' 
[ -n "${VARIABLE}" ] && FOO=${VARIABLE} 
+3

esto es bueno para la compatibilidad x con shells anteriores –

16

Incluso puede utilizar como valor por defecto el valor de otra variable

tener un archivo defvalue.sh

#!/bin/bash 
variable1=$1 
variable2=${2:-$variable1} 

echo $variable1 
echo $variable2 

ejecutar ./defvalue.sh first-value second-value salida

first-value 
second-value 

y ejecutar ./defvalue.sh first-value salida

first-value 
first-value 
+0

Gracias por mostrar un ejemplo con $ 1, $ 2 ... –

119

Si la variable es igual, entonces

: "${VARIABLE:=DEFAULT_VALUE}" 

asigna a DEFAULT_VALUE VARIABLE si no se define. Las comillas dobles evitan el engrosamiento y la división de palabras.

Consulte también la Sección 3.5.3, Shell Parameter Expansion, en el manual de Bash.

+4

Me acabo de referir de nuevo a esto otra vez, y otra vez, y otra vez !!! – chnrxn

+12

Este truco engañoso no era obvio para mí, usando: sin efecto incorporado para comer la expansión del $ {..} PERO dejando el conjunto VARIABLE. Hasta ahora, yo estaba haciendo esto: VARIABLE = "$ {VARIABLE: -DEFAULT_VALUE}" y me sentía dorky por usar VARIABLE dos veces. – dino

+0

Resulta que ESTO SIEMPRE NO FUNCIONA PARA LAS VARIABLES BASH-BUILTIN. Es muy muy raro. Actualmente, los que conozco son 'HISTTIMEFORMAT' – Otheus

7

Aquí es un ejemplo

#!/bin/bash 

default='default_value' 
value=${1:-$default} 

echo "value: [$value]" 

salva esto como script.sh y que sea ejecutable. ejecutarlo sin params

./script.sh 
> value: [default_value] 

ejecutarlo con el parámetro

./script.sh my_value 
> value: [my_value] 
10

Fwiw, se puede proporcionar un mensaje de error de este modo:

USERNAME=${1:?"Specify a username"} 

Esto muestra un mensaje como este y salidas con código 1:

./myscript.sh 
./myscript.sh: line 2: 1: Specify a username 

Un ejemplo más completo de todo:

#!/bin/bash 
ACTION=${1:?"Specify 'action' as argv[1]"} 
DIRNAME=${2:-$PWD} 
OUTPUT_DIR=${3:-${HOMEDIR:-"/tmp"}} 

echo "$ACTION" 
echo "$DIRNAME" 
echo "$OUTPUT_DIR" 

Salida:

$ ./script.sh foo 
foo 
/path/to/pwd 
/tmp 

$ export HOMEDIR=/home/myuser 
$ ./script.sh foo 
foo 
/path/to/pwd 
/home/myuser 
  • $ACTION toma el valor del primer argumento, y sale si está vacío
  • $DIRNAME es el segundo argumento, y el valor predeterminado es el directorio actual
  • $OUTPUT_DIR es el tercer argumento, o $HOMEDIR (si está definido), sino, /tmp. Esto funciona en OS X, pero no estoy seguro de que sea portátil.
1

Para responder a su pregunta y en todas las sustituciones de variables

echo "$\{var}" 
echo "Substitute the value of var." 


echo "$\{var:-word}" 
echo "If var is null or unset, word is substituted for var. The value of var does not change." 


echo "2- $\{var:=word}" 
echo "If var is null or unset, var is set to the value of word." 


echo "$\{var:?message}" 
echo "If var is null or unset, message is printed to standard error. This checks that variables are set correctly." 


echo "$\{var:+word}" 
echo "If var is set, word is substituted for var. The value of var does not change." 
Cuestiones relacionadas