Tengo un montón de pruebas en las variables en bash (3.00) secuencia de comandos de shell, donde si la variable no está definida, entonces se asigna un valor predeterminado, por ejemplo:

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

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

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

(aunque sé que eso no va a funcionar…)

Estoy loco, o algo como eso existe?

9 Comentarios

  1. 1035

    Muy cerca de lo que has publicado, en realidad:

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

    O que le asigne default a VARIABLE así:

    FOO=${VARIABLE:=default}  # If variable not set or null, set it to default.
    • Si quería encontrar en la documentación, lo que sería un google? Buscar en google con caracteres especiales como ${:- } no es muy fácil.
    • En respuesta a solarmist: «bash asignación de variable por defecto» déjame a esta página, y la búsqueda de bash página de manual con ‘variable culo’ me llevó a la sección de la derecha después de ~cinco ‘siguiente’
    • Tenga en cuenta que no bash específicos y trabajará con la totalidad de la concha de la familia. Es seguro generic-scripts.
    • ¿Alguien sabe porque esto funciona? El :-, := sintaxis es bastante misterioso…
    • La palabra clave es «bash parámetro de expansión», si desea saber más acerca de él y de sus compañeros.
    • ¿Cuál es la diferencia entre :- y := ?
    • Confirmo: yo probé en un perfil común es de origen tanto por bash y zsh yo uso en mi git versionada home y funciona bien en ambos.
    • el := es muy clara e intuitiva, entre muchos otros shell sustituciones declaraciones.
    • He utilizado estos términos best way to set var defaults in shell script. Me tienes aquí.
    • subjectAltName=${1:-${SUBJECT_ALT_NAME:-$defaultSubjectAltName}}; … es la sintaxis para las 3 alternativas … aquí el primer defecto es el primer parámetro pasado a la secuencia de comandos, cosa un env var se utiliza más de una secuencia de comandos de var se utiliza
    • He aquí una explicación más profunda sobre el tema unix.stackexchange.com/a/122848/2407
    • bash
    • Esta página tiene una buena hoja de trucos para explicar todos estos: stackoverflow.com/a/16753536/5359531
    • Lo que si quiero usar el shell de comandos en lugar de una VARIABLE? por ejemplo : FOO=${cat some_file:-null}
    • hace este trabajo en Bourne Shell /bin/sh, o sólo Bash (y ksh, zsh)?
    • buscar en google «bash ENV o defecto» me trajo aquí 🙂
    • quisiera saber ¿cuál es la diferencia, pero Google bloques de símbolos especiales!

  2. 238

    Argumentos de línea de comandos:

    VARIABLE=${1:-DEFAULTVALUE}    

    que asigna a VARIABLE el valor de la 1er argumento pasado a la secuencia de comandos o el valor de DEFAULTVALUE si no hay tal argumento fue aprobada.

  3. 201

    Si la variable es la misma, entonces

    : "${VARIABLE:=DEFAULT_VALUE}"

    asigna DEFAULT_VALUE VARIABLE si no se ha definido. Las comillas dobles evitar de esta expansión y la palabra de dividir.

    Ver también la Sección 3.5.3, Shell Parámetro De Expansión, en el manual de Bash.

    • Este complicado truco no era obvio para mí, usando el : no-efecto builtin a comer la expansión de la ${..} PERO dejando conjunto de VARIABLES. Hasta ahora yo estaba haciendo esto: VARIABLE=»${VARIABLE:-DEFAULT_VALUE}» y la sensación de boba para el uso de la VARIABLE dos veces.
    • Resulta que ESTO NO SIEMPRE funciona PARA BASH-las VARIABLES INTEGRADAS. Es muy muy raro. En la actualidad los conocidos para mí son HISTTIMEFORMAT
    • ¿cómo puedo configurar múltiples valores por defecto? He intentado «: ${VARIABLE:=DEFAULT_VALUE} : ${VARIABLE2:=DEFAULT_VALUE2}» pero eso no parece funcionar…
    • El colon es el comando (que no hace nada) y por lo tanto sólo es necesario una vez. E. g. : ${FOO:=DEFAULT1} ${BAR:=DEFAULT2}
  4. 30

    Incluso se puede utilizar como valor predeterminado el valor de otra variable

    tener un archivo de 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
    • Gracias por mostrar un ejemplo con $1, $2…
  5. 17

    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 "$\{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."
  6. 15

    Entonces hay la manera de expresar su ‘si’ construir más lacónicamente:

    FOO='default'
    [ -n "${VARIABLE}" ] && FOO=${VARIABLE}
    • esto es bueno para x-compatibilidad con versiones anteriores de conchas
    • Esto es bueno para la compatibilidad con OS X bash.
  7. 14

    Por lo que vale, puede proporcionar un mensaje de error como el siguiente:

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

    Este muestra un mensaje como este y sale 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"

    De 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 si sale vacía
    • $DIRNAME es el 2º argumento, y el valor predeterminado es el directorio actual
    • $OUTPUT_DIR es el 3er argumento, o $HOMEDIR (si está definido), de lo contrario, /tmp. Esto funciona en OS X, pero no estoy seguro de que es portable.
  8. 9

    Aquí es un ejemplo

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

    guardar como script.sh y hacerlo ejecutable.
    ejecuta sin parámetros

    ./script.sh
    > value: [default_value]

    ejecutarlo con el parámetro

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

Dejar respuesta

Please enter your comment!
Please enter your name here