Проблема с другими ответами заключается в том, что они либо используют глобальные переменные, которые могут быть перезаписаны, когда несколько функций находятся в цепочке вызовов, либо echo
это означает, что ваша функция не может выводить диагностическую информацию (вы забудете, что ваша функция выполняет это, и "результат", т.е. возвращает значение, будет содержать больше информации, чем ожидает ваш вызывающий объект, что приведет к странным ошибкам) или eval
слишком тяжелым и хакерским.
Правильный способ сделать это - поместить в функцию материал верхнего уровня и использовать local
правило динамической видимости bash. Пример:
func1()
{
ret_val=hi
}
func2()
{
ret_val=bye
}
func3()
{
local ret_val=nothing
echo $ret_val
func1
echo $ret_val
func2
echo $ret_val
}
func3
Это выводы
nothing
hi
bye
Динамическая область видимости означает, что ret_val
в зависимости от абонента указывается на другой объект! Это отличается от лексической области видимости, которая используется большинством языков программирования. На самом деле это документированная функция , которую легко не заметить, и она не очень хорошо объяснена, вот документация к ней (выделение мое):
Переменные, локальные для функции, могут быть объявлены с помощью локальной встроенной функции. Эти переменные видны только функции и командам, которые она вызывает .
Для кого-то с фоном C / C ++ / Python / Java / C # / javascript это, вероятно, самое большое препятствие: функции в bash не являются функциями, они являются командами и ведут себя как таковые: они могут выводить в stdout
/ stderr
, они могут передавать в / out, они могут вернуть код выхода. По сути, нет никакой разницы между определением команды в скрипте и созданием исполняемого файла, который можно вызывать из командной строки.
Так что вместо того, чтобы писать свой сценарий так:
top-level code
bunch of functions
more top-level code
напишите это так:
# define your main, containing all top-level code
main()
bunch of functions
# call main
main
где main()
объявляется ret_val
как local
и все другие функции возвращают значения через ret_val
.
См. Также следующий вопрос по Unix и Linux: Область действия локальных переменных в функциях оболочки .
Другое, возможно, даже лучшее решение, в зависимости от ситуации, - это то , которое использует ya.tecklocal -n
.
return
в вашем случае это по сути то же самое,exit code
что и диапазон от0 - 255
. Используйтеecho
как предложено @septi. Коды выхода могут быть записаны с$?
.