una - Asignación de valores predeterminados a variables de shell con un solo comando en bash
scripts bash ejemplos (9)
Tengo un montón de pruebas sobre variables en un script de shell bash (3.00) donde, si la variable no está establecida, asigna un valor predeterminado, por ejemplo:
if [ -z "${VARIABLE}" ]; then
FOO=''default''
else
FOO=${VARIABLE}
fi
Me parece recordar que hay una sintaxis para hacer esto en una línea, algo parecido a un operador ternario, por ejemplo:
FOO=${ ${VARIABLE} : ''default'' }
(aunque sé que no funcionará ...)
¿Estoy loco o existe algo así?
Aquí hay un ejemplo
#!/bin/bash
default=''default_value''
value=${1:-$default}
echo "value: [$value]"
Guarda esto como script.sh y hazlo ejecutable. ejecutalo sin params
./script.sh
> value: [default_value]
corre con param
./script.sh my_value
> value: [my_value]
FWIW, puede proporcionar un mensaje de error así:
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 por defecto es el 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.
Incluso puedes 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
salida de ./defvalue.sh first-value second-value
first-value
second-value
y ejecute ./defvalue.sh first-value
salida
first-value
first-value
Luego está la forma de expresar tu construcción "si" de forma más concisa:
FOO=''default''
[ -n "${VARIABLE}" ] && FOO=${VARIABLE}
Muy cerca de lo que publicaste, en realidad:
FOO=${VARIABLE:-default} # If variable not set or null, use default.
O, que también asignará el default
a VARIABLE
:
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 pasa dicho argumento.
Para responder a tu 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."
Si la variable es igual, entonces
: "${VARIABLE:=DEFAULT_VALUE}"
asigna DEFAULT_VALUE a VARIABLE si no está definido. Las comillas dobles evitan el intercambio de palabras y la división de palabras.
También vea la Sección 3.5.3, Expansión de parámetros de Shell , en el manual de Bash.