Переменные в Bash. Передача значений по-умолчанию ${var:-defaultvalue}, замена значений ${var:+alternatevalue} и сообщений – ${var:?message}
Использование значений по-умолчанию в переменных – ${var:-defaltvalue} и ${var-defaltvalue}
Конструкция ${var:-defaltvalue} позволяет выполнять проверку – имеется ли значение у переменной, и задана ли переменная вообще. Если нет – то будет присвоено значение “defaltvalue“.
Примеры:
| 2 | $ echo ${var:-defaltvalue} | 
Удалим значение перемеренной:
| 2 | $ echo ${var:-defaltvalue} | 
Допустимо использование функций для определения default-значения, например:
| 2 | $ echo ${var:-$(whoami)} | 
| 2 | $ echo ${var:-$(whoami)} | 
Или так:
| 1 | $ echo ${var:-`whoami`} | 
Использование этой же конструкции, но без указания двоеточия “:” вызовет только проверку имеется ли переменная вообще, но без проверки её содержимого, например:
| 2 | $ echo ${var-defaltvalue} | 
Удалим переменную:
| 2 | $ echo ${var-defaltvalue} | 
Использование альтернативных значений для переменных – ${var:+alternatevalue} и ${var+alternatevalue}
В отличии от предыдущей конструкции, +alternatevalue выполняет проверку на наличие переменной и её значения, и только в случае положительного результат – выполняет замену.
При использовании с двоеточием – будет выполнена проверка только на наличие значения в переменной:
| 2 | $ echo ${var:+alternatevalue} | 
Если значение у переменной имеется – оно будет заменено на alternatevalue:
| 2 | $ echo ${var:+alternatevalue} | 
Без двоеточия – замена будет выполнена, если переменная задана, даже если у неё нет значения:
| 2 | $ echo ${var+alternatevalue} | 
| 2 | $ echo ${var+alternatevalue} | 
| 2 | $ echo ${var+alternatevalue} | 
Использование значений по-умолчанию в переменных – ${var:=defaultvalue} т ${var=defaultvalue}
Эти конструкции выполняют почти те же действия, что и ${var:-defaltvalue} и ${var-defaltvalue}.
С пустой переменной:
| 2 | $ echo ${var:-defaultvalue} | 
| 2 | $ echo ${var:=defaultvalue} | 
Переменная, содержащая значение:
| 2 | $ echo ${var:-defaultvalue} | 
| 2 | $ echo ${var:=defaultvalue} | 
С отсутствующей переменной:
| 2 | $ echo ${var:-defaultvalue} | 
| 2 | $ echo ${var:=defaultvalue} | 
Разница между ними заключается в том, что -defaultvalue выполняет подстановку значения, тогда как =defaultvalue – устанавливает значение переменной:
| 2 | $ echo ${var:-defaultvalue} | 
| 2 | $ echo ${var:=defaultvalue} | 
Однако – =defaultvalue не может быть использован с позиционными и другими специальными аргументами:
| 1 | $ var () { a=${1:-defaultvalue}; printf "$an"; }; var | 
| 1 | $ var () { a=${1:=defaultvalue}; printf "$an"; }; var | 
| 2 | -bash: $1: cannot assign in this way | 
 Вывод сообщения об ошибке – ${var:?message} и ${var?message}
Проверка на наличие переменной и значения в ней:
| 2 | $ echo ${var:?Var can't be empty} | 
| 3 | -bash: var: Var can't be empty | 
| 2 | $ echo ${var?Var must be declared} | 
| 3 | -bash: var: Var must be declared |