Вы не можете вернуть произвольный результат из функции оболочки. Вы можете вернуть только код состояния, который является целым числом от 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")
- Назначьте одну или несколько переменных внутри функции и прочитайте эти переменные позже.