Проблема з іншими відповідями полягає в тому, що вони або використовують глобальний, який можна перезаписати, коли кілька функцій перебувають у ланцюзі викликів, або 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
, вони можуть передавати в / вихід, вони можуть повернути вихідний код. В основному немає різниці між визначенням команди в скрипті та створенням виконуваного файлу, який можна викликати з командного рядка.
Тож замість того, щоб писати сценарій так:
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.teck, яке використовує local -n
.
return
у вашому випадку по суті те саме,exit code
що і діапазон0 - 255
. Використовуйтеecho
за пропозицією @septi. Вихідні коди можна захопити за допомогою$?
.