Ви не можете повернути довільний результат від функції оболонки. Ви можете повернути лише код статусу, який є цілим числом від 0 до 255. (Хоча ви можете передати більшу величину return, вона має усічений модуль 256.) Значення повинно бути 0, щоб вказувати на успіх, а інше значення - для вказівки невдачі; за домовленістю слід дотримуватися кодів помилок між 1 і 125, оскільки вищі значення мають особливе значення (погана зовнішня команда для 126 і 127, вбита сигналом для більш високих значень).
Оскільки ви повертаєте результат "так" чи "ні", код статусу є відповідним. Оскільки, flagздається, вказує на успіх чи невдачу, слід використовувати звичайні значення 0 для успіху та 1 для відмови (протилежне тому, що ви написали). Потім ви можете використовувати свою функцію безпосередньо в операторі if.
valNum ()
{
local flag=0
if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then
echo 1>&2 "Invalid Number"
flag=1
fi
return $flag
}
if valNum "$num"; then
#do something
fi
Якщо вам потрібно розмежувати коди відмов, зателефонуйте безпосередньо до цієї функції. Відразу після повернення код відмови доступний в $?. Потім ви можете перевірити це із заявою:
valNum "$num"
case $? in …
Якщо вам потрібно буде скористатися кодом статусу пізніше, збережіть його в іншій змінній, перш ніж $?буде замінена наступною командою.
valNum "$num"
valNum_status=$?
Те, що ви написали, не працювало, оскільки підміна команд $(…)розширюється до виводу функції, яка у вашому коді є або повідомленням про помилку, або порожнім, ніколи 1.
Якщо вам потрібно передати більше інформації, ніж код стану дозволяє з оболонки, у вас є дві можливості:
- Надрукуйте текст на стандартному виході та зателефонуйте до функції в підстановці команд:
$(valNum "$num")
- Призначте одну або кілька змінних всередині функції та прочитайте ці змінні пізніше.