Вопрос по bash – Использование: - (двоеточие тире) в Баш

48

Что означает этот стиль в Bash?

${PUBLIC_INTERFACE:-eth0}

Какова цель:-?

Ваш Ответ

2   ответа
65

Если$PUBLIC_INTERFACE существует и не равно нулю, возвращает его значение, в противном случае возвращает"eth0".

На самом деле некоторые из них описаны встраница руководства bash:

${parameter:-word} Use Default Values. If parameter is unset or null, the expansion of word is substituted. Otherwise, the value of parameter is substituted.

${parameter:=word} Assign Default Values. If parameter is unset or null, the expansion of word is assigned to parameter. The value of parameter is then substituted. Positional parameters and special parameters may not be assigned to in this way.

${parameter:?word} Display Error if Null or Unset. If parameter is null or unset, the expansion of word (or a message to that effect if word is not present) is written to the standard error and the shell, if it is not interactive, exits. Otherwise, the value of parameter is substituted.

${parameter:+word} Use Alternate Value. If parameter is null or unset, nothing is substituted, otherwise the expansion of word is substituted.

5

:- используется в${parameter:-word} расширение параметров оболочки: еслиparameter является нулевым или не установленным, оно расширяется до значенияwordв противном случае к значениюparameter.

Пример:

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

Это и аналогичные расширения, использующие:=, :+ а также:? все бывают двух видов: с двоеточием и без него. Разница в том, что расширениеwith толстая кишка начинает действовать в течение "null"or unset& quot ;, тогда какwithout двоеточие, это просто "ноль".

Заметим:

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

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

Где это полезно? Несколько примеров:

  • Default values

    • The editor invoked to edit the last command with fc is the result of the expansion ${FCEDIT:-${EDITOR:-vi}}: $FCEDIT if defined, or else $EDITOR if defined, or else vi.
    • A loop in a script that should read from a file if one is provided as an argument and from standard input otherwise could look like this:

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

    set -u is a handy way to force cleaner scripting by having the script die when encountering an unset variable, as promoted by for example this article (not that I endorse everything in there1). If we want to check if a certain variable has a value with [[ $var ]], the script now dies if var is unset, even though this might be legitimate.

    The way around this is using [[ ${var:-} ]] instead, and set -u won't complain. (This is basically using a default value again, but the substituted value is the empty string in this case.)

Кстати, эти расширения не являются эксклюзивными для Bash:Спецификация оболочки POSIX есть их все тоже.


1 See also BashFAQ / 112, в чем преимущества и недостатки использованияset -u (or set -o nounset)?

Похожие вопросы