BASH: переменные — передача значений по-умолчанию ${var:-defaultvalue}, замена значений — ${var:+alternatevalue} и сообщений — ${var:?message}

Автор: | 08/08/2014
 

terminalИспользование значений по-умолчанию в переменных — ${var:-defaltvalue} и ${var-defaltvalue}

Конструкция ${var:-defaltvalue} позволяет выполнять проверку — имеется ли значение у переменной, и задана ли переменная вообще. Если нет — то будет присвоено значение «defaltvalue«.

Примеры:

$ var=var
$ echo ${var:-defaltvalue}
var

Удалим значение перемеренной:

$ var=
$ echo ${var:-defaltvalue}
defaultvalue

Допустимо использование функций для определения default-значения, например:

$ var=var
$ echo ${var:-$(whoami)}
var
$ var=
$ echo ${var:-$(whoami)}
setevoy

Или так:

$ echo ${var:-`whoami`}
setevoy

Использование этой же конструкции, но без указания двоеточия «:» вызовет только проверку имеется ли переменная вообще, но без проверки её содержимого, например:

$ var=
$ echo ${var-defaltvalue}
$

Удалим переменную:

$ unset var
$ echo ${var-defaltvalue}
defaltvalue

Использование альтернативных значений для переменных — ${var:+alternatevalue} и ${var+alternatevalue}

В отличии от предыдущей конструкции, +alternatevalue выполняет проверку на наличие переменной и её значения, и только в случае положительного результат — выполняет замену.

При использовании с двоеточием — будет выполнена проверка только на наличие значения в переменной:

$ var=
$ echo ${var:+alternatevalue}
$

Если значение у переменной имеется — оно будет заменено на alternatevalue:

$ var=var
$ echo ${var:+alternatevalue}
alternatevalue

Без двоеточия — замена будет выполнена, если переменная задана, даже если у неё нет значения:

$ var=
$ echo ${var+alternatevalue}
alternatevalue
$ var=var
$ echo ${var+alternatevalue}
alternatevalue
$ unset var
$ echo ${var+alternatevalue}
$

Использование значений по-умолчанию в переменных — ${var:=defaultvalue} т ${var=defaultvalue}

Эти конструкции выполняют почти те же действия, что и ${var:-defaltvalue} и ${var-defaltvalue}.

С пустой переменной:

$ var=
$ echo ${var:-defaultvalue}
defaultvalue
$ var=
$ echo ${var:=defaultvalue}
defaultvalue

Переменная, содержащая значение:

$ var=var
$ echo ${var:-defaultvalue}
var
$ var=var
$ echo ${var:=defaultvalue}
var

С отсутствующей переменной:

$ unset var
$ echo ${var:-defaultvalue}
defaultvalue
$ unset var
$ echo ${var:=defaultvalue}
defaultvalue

Разница между ними заключается в том, что -defaultvalue выполняет подстановку значения, тогда как =defaultvalueустанавливает значение переменной:

$ var=
$ echo ${var:-defaultvalue}
defaultvalue
$ echo ${#var}
0
$ var=
$ echo ${var:=defaultvalue}
defaultvalue
$ echo ${#var}
12
$ echo ${var}
defaultvalue

Однако — =defaultvalue не может быть использован с позиционными и другими специальными аргументами:

$ var () { a=${1:-defaultvalue}; printf "$an"; }; var
defaultvalue
$ var () { a=${1:=defaultvalue}; printf "$an"; }; var
-bash: $1: cannot assign in this way

 Вывод сообщения об ошибке — ${var:?message} и ${var?message}

Проверка на наличие переменной и значения в ней:

$ var=
$ echo ${var:?Var can't be empty}
-bash: var: Var can't be empty
$ unset var
$ echo ${var?Var must be declared}
-bash: var: Var must be declared