То, что вы ищете, это косвенное.
assertNotEmpty() {
: "${!1:? "$1 is empty, aborting."}"
}
Это приводит к прерыванию работы сценария с сообщением об ошибке, если вы делаете что-то вроде этого:
$ foo=""
$ assertNotEmpty foo
bash: !1: foo is empty, aborting.
Если вы просто хотите проверить , является ли foo
пустым, вместо прерывания сценария, используйте это вместо функции:
[[ $foo ]]
Например:
until read -p "What is your name? " name && [[ $name ]]; do
echo "You didn't enter your name. Please, try again." >&2
done
Также обратите внимание, что существует очень важное различие между пустым и unset параметром. Вы должны позаботиться о том, чтобы не перепутать эти условия! Пустой параметр - это тот, который установлен, но просто установлен в пустую строку. Неустановленный параметр - это тот, который вообще не существует.
Все предыдущие примеры тестируют параметры empty . Если вы хотите проверить неустановленные параметры и считать все установленные параметры в порядке, независимо от того, пусты они или нет, используйте это:
[[ ! $foo && ${foo-_} ]]
Используйте его в такой функции:
assertIsSet() {
[[ ! ${!1} && ${!1-_} ]] && {
echo "$1 is not set, aborting." >&2
exit 1
}
}
Который прерывает сценарий, только когда переданное вами имя параметра обозначает параметр, который не установлен:
$ ( foo="blah"; assertIsSet foo; echo "Still running." )
Still running.
$ ( foo=""; assertIsSet foo; echo "Still running." )
Still running.
$ ( unset foo; assertIsSet foo; echo "Still running." )
foo is not set, aborting.