Asignación de valores predeterminados a variables de shell con un solo comando en bash

Tengo un montón de pruebas sobre variables en un script de shell bash (3.00) donde si la variable no está establecida, entonces asigna un valor predeterminado, por ejemplo:

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

Me parece recordar que hay una syntax para hacer esto en una línea, algo parecido a un operador ternario, por ejemplo:

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

(Aunque sé que eso no funcionará …)

¿Estoy loco o existe algo así?

Muy cerca de lo que publicaste, en realidad:

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

O bien, que asignará el default a VARIABLE también:

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

Para argumentos de línea de comando:

 VARIABLE=${1:-DEFAULTVALUE} 

que asigna a VARIABLE el valor del primer argumento pasado al script o el valor de DEFAULTVALUE si no se pasó dicho argumento.

Si la variable es la misma, entonces

 : "${VARIABLE:=DEFAULT_VALUE}" 

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

Consulte también la Sección 3.5.3, Expansión de parámetros de shell , en el manual de Bash.

ver aquí en 3.5.3 (expansión de parámetros de shell)

entonces en tu caso

 ${VARIABLE:−default} 

Incluso puede usar como valor predeterminado 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

 first-value second-value 

y ejecute la ./defvalue.sh first-value

 first-value first-value 

Luego está la forma de express su construcción ‘si’ más a la ligera:

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

FWIW, puede proporcionar un mensaje de error como ese:

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

Esto muestra un mensaje como este y sale con el 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 se predetermina al directorio actual
  • $OUTPUT_DIR es el tercer argumento, o $HOMEDIR (si está definido), else, /tmp . Esto funciona en OS X, pero no estoy seguro de que sea portátil.

Aquí hay un ejemplo

 #!/bin/bash default='default_value' value=${1:-$default} echo "value: [$value]" 

guárdelo como script.sh y hágalo ejecutable. ejecutarlo sin params

 ./script.sh > value: [default_value] 

ejecutarlo con param

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

Para responder a su pregunta y sobre 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."