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."