У меня есть функция, которая возвращает 1, если число является действительным десятизначным числом:
valNum()
{
flag=1
if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then
echo "Invalid Number"
flag=0
fi
return $flag
}
Это вызывается:
if [[ $(valNum $num) -eq 1 ]]; then
#do something
fi
Функция работает нормально, если число допустимо, но показывает синтаксическую ошибку, если ввести недопустимое число.
источник
if valnum "$num"
эквивалентен,if valnum "$num" = 0
т. е. «если это правда». Основное эмпирическое правило в сценариях sh: 0 = истина / успех, ненулевое = ложь / ошибка.if [[ $(valNum $num) -eq 1 ]]
Вы не можете вернуть произвольный результат из функции оболочки. Вы можете вернуть только код состояния, который является целым числом от 0 до 255. (Хотя вы можете передать большее значение
return
, оно усекается по модулю 256.) Значение должно быть 0, чтобы указывать успех, и другое значение, чтобы указывать сбой; по договоренности вы должны придерживаться кодов ошибок от 1 до 125, так как более высокие значения имеют особое значение (неверная внешняя команда для 126 и 127, прерывается сигналом для более высоких значений).Так как вы возвращаете здесь результат «да» или «нет», соответствующий код состояния. Поскольку,
flag
похоже, указывает на успех или неудачу, вы должны использовать обычные значения 0 для успеха и 1 для неудачи (в противоположность тому, что вы написали). Затем вы можете использовать свою функцию непосредственно в операторе if.Если вам необходимо различать коды ошибок, вызовите функцию напрямую. Сразу после возврата код ошибки доступен в
$?
. Затем вы можете проверить это с помощью case case:Если вам потребуется использовать код состояния позже, сохраните его в другой переменной, прежде чем он
$?
будет перезаписан следующей командой.То, что вы написали, не сработало, потому что подстановка команд
$(…)
распространяется на выходные данные функции, которая в вашем коде является либо сообщением об ошибке, либо пустым, никогда1
.Если вам нужно передать больше информации, чем позволяет код состояния, из функций оболочки, у вас есть две возможности:
$(valNum "$num")
источник
У меня были противоречивые результаты в этой области самостоятельно. Вот результаты моих эмпирических экспериментов. Во-первых, некоторая « теория » о командах bash или * nix:
Пример:
Вывод:
Как показано,
ls
команда возвращает код состояния = 2. При попытке ввода действительного каталога состояние равно нулю ( 0 ). Не так, как почти все другие языки.Правило № 1 - Сделать ...
Мы должны помнить, что мы тестируем коды ошибок в
if
инструкции Bash . Я установил константы, или вы можете использовать shelltrue
илиfalse
команды.и вывод:
Тем не менее, я предлагаю вам дать « голосование » @Gilles, потому что его ответ правильный. Я просто хотел получить упрощенную сторону на ePaper.
Еще одна вещь,
test
команда. Это выглядит так:Большую часть времени. И например:
Ноль (0) соответствует действительности . Почему? Ну, на странице руководства сказано, что один аргумент является « истиной », когда он НЕ равен NULL.
Ссылки:
источник