Вы не можете вернуть произвольный результат из функции оболочки. Вы можете вернуть только код состояния, который является целым числом от 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
Если вам необходимо различать коды ошибок, вызовите функцию напрямую. Сразу после возврата код ошибки доступен в $?. Затем вы можете проверить это с помощью case case:
valNum "$num"
case $? in …
Если вам потребуется использовать код состояния позже, сохраните его в другой переменной, прежде чем он $?будет перезаписан следующей командой.
valNum "$num"
valNum_status=$?
То, что вы написали, не сработало, потому что подстановка команд $(…)распространяется на выходные данные функции, которая в вашем коде является либо сообщением об ошибке, либо пустым, никогда 1.
Если вам нужно передать больше информации, чем позволяет код состояния, из функций оболочки, у вас есть две возможности:
- Напечатайте некоторый текст в стандартный вывод и вызовите функцию в подстановке команд:
$(valNum "$num")
- Назначьте одну или несколько переменных внутри функции и прочитайте эти переменные позже.