2012-04-30 11 views
39

¿Cuál es el significado de este estilo en bash?Uso de: - (dos puntos) en bash

${PUBLIC_INTERFACE:-eth0} 

¿Cuál es el propósito de :-?

+0

posible duplicado de [¿Cómo funciona la expansión de parámetros fiesta?] (Http://stackoverflow.com/questions/3881811/how-does-bash-parameter -expansion-work) (aunque la respuesta aquí entra en más detalles) – cmbuckley

+2

sí, está duplicado ... pero el título de mi pregunta es más informativo y la respuesta como dijiste es mejor ... gracias – pahko

Respuesta

53

Si $PUBLIC_INTERFACE existe y no es nulo, devuelva su valor; de lo contrario, devuelva "eth0".

En realidad, hay unos pocos de estos documentado en el bash man page:

$ {} -word parámetros: Usar valores predeterminados. Si el parámetro está desactivado o nulo, la expansión de la palabra se sustituye. De lo contrario, el valor del parámetro es sustituido.

$ {parámetro: = palabra} Asignar valores predeterminados. Si el parámetro está desactivado o es nulo, la expansión de la palabra se asigna al parámetro. El valor del parámetro se sustituye. Los parámetros de posición y los parámetros especiales no se pueden asignar de esta manera.

$ {parámetro:? Palabra} Pantalla de error si Null o desarmar. Si el parámetro es nulo o no está configurado, la expansión de la palabra (o un mensaje a ese efecto si la palabra no está presente) se escribe en el error estándar y el shell, si no es interactivo, se cierra. De lo contrario, el valor del parámetro es sustituido.

$ {parameter: + word} Use Alternate Value. Si el parámetro es nulo o no está configurado, no se sustituye nada; de lo contrario, se sustituye la expansión de la palabra.

+0

muchas gracias !! !!! – pahko

3

:- se utiliza en la ${parameter:-word}shell parameter expansion: si parameter es nulo o no triscado, se expande al valor de word, de lo contrario al valor de parameter.

Ejemplo:

$ str= 
$ echo "${str:-default}" 
default 

Esto y las expansiones similares utilizando :=, :+ y :? todos vienen en dos sabores: con y sin un colon. La diferencia es que la expansión con el colon comienza con "nulo o unset", mientras que sin dos puntos, es simplemente "nulo".

Observe:

$ str=      # Null, but not unset 
$ echo "${str-default}"  # Expands to value of $str, the empty string 

$ echo "${str:-default}" # Expands to "default" 
default 

Donde esto es útil?Unos pocos ejemplos:

  • valores por defecto

    • El editor invocado para editar el último comando con fc es el resultado de la expansión ${FCEDIT:-${EDITOR:-vi}}: $FCEDIT si está definido, o de lo contrario $EDITOR si está definida, o else vi.
    • un bucle en una secuencia de comandos que se deben leer de un archivo si se proporciona como un argumento y de la entrada estándar de otro modo podría tener este aspecto:

      while IFS= read -r line; do 
          # do something 
      done < "${1:-/dev/stdin}" 
      
  • Al utilizar set -u

    set -u es una forma útil de forzar scripts más limpios haciendo que el script muera cuando se encuentra con una variable no definida, como lo promueve, por ejemplo, this article (no es que yo apruebe todo ing in there). Si queremos verificar si una cierta variable tiene un valor con [[ $var ]], la secuencia de comandos ahora muere si var está desarmado, aunque esto podría ser legítimo.

    La forma de evitar esto es usar [[ ${var:-} ]] en su lugar, y set -u no se quejará. (Esto es, básicamente, utilizando un valor por defecto de nuevo, pero el valor sustituido es la cadena vacía en este caso.)

Estas expansiones no son exclusivos de Bash, por cierto: el POSIX shell spec los tiene todos, también.


Véase también BashFAQ/112, What are the advantages and disadvantages of using set -u (or set -o nounset)?

Cuestiones relacionadas