Перейти к содержанию

Квазипеременные в скриптах

Прочитал об интересной особенности shell - квазипеременных. Это такая переменная, результирующее значение которой зависит от некоторого условия.

Вот примеры таких переменных:

Формат Описание
${VAR:-expression} Если VAR существует и не пустая, возвращается ее значение, иначе - возвращается значение выражения expression
${VAR:=expression} Если VAR существует и не пустая, возвращается ее значение, иначе - VAR устанавливается в значение expression и возвращается expression
${VAR:?expression} Если VAR существует и не пустая, возвращается ее значение, иначе - в stderr выводится значение expression и работа завершается с не нулевым кодом
${VAR:+expression} Если VAR существует и не пустая, пустое значение, иначе - вращается значение expression
${#VAR} Возвращается длина значения VAR

Любопытный пример использования квазипеременных - компактная конструкция switch:

f1() {
  echo "function 1"; echo $@
}

f2() {
  echo "function 2"; echo $@
}

help() {
  echo "help"
}
ARGS=$@
${1:-help}

Здесь, при запуске скрипта без аргументов, будет вызвана функция help. Если будет указан аргумент, будет предпринята попытка вызова функции с таким же именем. Если такой функции нет, то будет предпринята попытка запуска команды с таким же именем. В противном случае будет выведено стандартное сообщение об ошибке.