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

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

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

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

Примеры:

[simterm]

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

[/simterm]

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

[simterm]

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

[/simterm]

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

[simterm]

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

[/simterm]

Или так:

[simterm]

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

[/simterm]

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

[simterm]

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

[/simterm]

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

[simterm]

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

[/simterm]

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

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

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

[simterm]

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

[/simterm]

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

[simterm]

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

[/simterm]

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

[simterm]

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

[/simterm]

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

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

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

[simterm]

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

[/simterm]

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

[simterm]

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

[/simterm]

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

[simterm]

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

[/simterm]

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

[simterm]

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

[/simterm]

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

[simterm]

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

[/simterm]

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

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

[simterm]

$ 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

[/simterm]