Подтвердить что ты не робот

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

В чем смысл этого стиля в bash?

${PUBLIC_INTERFACE:-eth0}

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

4b9b3361

Ответ 1

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

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

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

${parameter: = word} Назначить значения по умолчанию. Если параметр не задан или null, расширение слова присваивается параметру. Затем значение параметра заменяется. Таким образом нельзя назначить позиционные параметры и специальные параметры.

${parameter:? word} Отобразить ошибку, если Null или Unset. Если параметр равен нулю или не задан, расширение слова (или сообщение на этот счет, если слово отсутствует) записывается в стандартную ошибку, и оболочка, если она не является интерактивной, завершает работу. В противном случае значение параметра будет заменено.

${parameter: + word} Используйте альтернативное значение. Если параметр имеет значение null или не задан, ничто не заменяется, иначе заменяется слово.

Ответ 2

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

Пример:

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

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

Заметим:

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

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

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

  • Значения по умолчанию

    • Редактор, вызванный для редактирования последней команды с fc, является результатом расширения ${FCEDIT:-${EDITOR:-vi}}: $FCEDIT, если определено, или $EDITOR, если определено, или vi.
    • Цикл в script, который должен читать из файла, если он указан как аргумент, и из стандартного ввода в противном случае может выглядеть так:

      while IFS= read -r line; do
          # do something
      done < "${1:-/dev/stdin}"
      
  • При использовании set -u

    set -u - это удобный способ принудительного создания сценариев с помощью script die при встрече с неустановленной переменной, чему способствует, например, эта статья (не то, что я поддерживаю все там 1). Если мы хотим проверить, имеет ли определенная переменная значение с [[ $var ]], script теперь умирает, если var не задано, хотя это может быть законным.

    В этом случае используется [[ ${var:-} ]], а set -u не будет жаловаться. (Это в основном использует значение по умолчанию снова, но замещаемое значение представляет собой пустую строку в этом случае.)

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


1 См. также BashFAQ/112, Каковы преимущества и недостатки использования set -u (или набора -o nounset)?