Я создаю небольшую библиотеку функций bash, чтобы инкапсулировать некоторые из более загадочных структур синтаксиса bash в подпрограммы, которые я могу быстро использовать и ссылаться. Но для некоторых из них я запускаю неожиданные коды возврата из своих функций. Ниже приведен пример функции «is_undefined». Может ли кто-нибудь объяснить результаты, которые я получаю? (Также представлены ниже.)Почему моя функция bash возвращает неожиданный код возврата?
#!/bin/bash
is_undefined()
{
# aka "unset" (not to be confused with "set to nothing")
# http://stackoverflow.com/questions/874389/bash-test-for-a-variable-unset-using-a-function
[ -z ${1+x} ]
}
if [ -z ${UNDEFINED+x} ]; then
echo "inline method reports that \$UNDEFINED is undefined"
fi
if is_undefined UNDEFINED; then
echo "is_undefined() reports that \$UNDEFINED is undefined"
else
echo "is_undefined() reports that \$UNDEFINED is defined"
fi
DEFINED=
if is_undefined DEFINED; then
echo "is_undefined() reports that \$DEFINED is undefined"
else
echo "is_undefined() reports that \$DEFINED is defined"
fi
Неожиданные результаты:
$ ./test.sh
inline method reports that $UNDEFINED is undefined
is_undefined() reports that $UNDEFINED is defined
is_undefined() reports that $DEFINED is defined
Добавить 'set -vx', чтобы увидеть, как/что обрабатывается, когда. Удачи. – shellter
В последней версии 'bash' есть оператор' -v', чтобы проверить, установлена ли переменная. '[[-v foo]]' преуспевает, только если 'foo' не установлен; если 'foo' установлен в пустую строку, он терпит неудачу. – chepner
Относительно -v: Мне удалось получить это в моем коде несколько месяцев назад, но забыл документировать ссылку. Я удалил его прошлой ночью, потому что я не нашел его упомянутым в моей книге bash, и googling это не дало никаких результатов. Я думал, что, должно быть, это представлял ... Полагаю, нет! :) –