
Вот фрагмент моего кода:
ninja ()
{
if $1 = toto
then
return 1
elif $1 = tata
then
return 4
fi
}
main () {
ninja "tata"
if [ $? -ne 1 ]
then
somecode
fi
}
main "$@"
Без всякой причины, когда моя функция что-то возвращает, программа просто завершает работу (я тестировал с помощью ловушки EXIT), функция возвращает 4 и выполняет ловушку.
Редактировать: работает, когда я комментирую
set -o errexit
set -o errtrace
Но как мне найти ошибку?
решение1
Если вы хотите проверить, эквивалентен ли аргумент функции некоторой строке, вы должны использовать construct if [ "$x" == "string" ]
, тогда ваш код будет выглядеть так:
test () {
if [ "$1" == "toto" ] then
return 1
elif [ "$1" == "tata" ] then
return 4
fi
}
main () {
test "tata"
if [ $? -ne 1 ] then
echo "somecode"
fi
}
main "$@"
И вы могли бы использовать test
имя для функции. Если вы хотите вызвать builtin test
, то используйте builtin test
construct.
И позаботьтесь о =
(присваивании) и ==
(сравнении). Внутри теста [
и ]
оператор =
работает как ==
и проверяет равенство строк (не чисел).
set -o errexit
выходит сразу после того, как команда возвращает ненулевое значение (неуспешное). Ваш ninja
возвращает 1
(которое ненулевое значение) и выходит.
Ваш код без тестов не работает, так как if
оператор пытается выполнить инструкции в нем и определить состояние выхода команды: если состояние выхода равно нулю (успех), то выполнить инструкции после then
until elif
of fi
.