Почему вы должны заботиться о том, что я говорю, несмотря на то, что есть ответ 250+ upvote
Дело не в этом 0 = true
а 1 = false
. Это: ноль означает отсутствие отказа (успех) и ненулевое значение означает отказ (типа N) .
Хотя выбранный ответ является технически «верным», пожалуйста , не ставьте return 1
** в своем коде для ложного . У него будет несколько неприятных побочных эффектов.
- Опытные разработчики заметят вас как любителя (по причине ниже).
- Опытные разработчики этого не делают (по всем причинам, указанным ниже).
- Это подвержено ошибкам.
- Даже опытные разработчики могут ошибочно принять 0 и 1 как false и true соответственно (по причине выше).
- Это требует (или будет поощрять) посторонние и смешные комментарии.
- На самом деле это менее полезно, чем неявные статусы возврата.
Узнайте немного
Руководство Bash говорит (выделено мое)
возврат [n]
Заставить функцию оболочки прекратить выполнение и вернуть значение n вызывающей стороне. Если n не указано, возвращаемое значение является состоянием выхода последней команды, выполненной в функции.
Поэтому нам не нужно НИКОГДА использовать 0 и 1 для обозначения True и False. Тот факт, что они делают это, является по существу тривиальным знанием, полезным только для отладки кода, вопросов об интервью и для того, чтобы поразить умы новичков.
Руководство Bash также говорит
в противном случае статус возврата функции является статусом выхода последней выполненной команды
Руководство Bash также говорит
( $? ) Расширяется до состояния выхода последнего выполненного переднего плана конвейера .
Ой, подожди. Трубопровод? Давайте вернемся к руководству по bash еще раз.
Конвейер - это последовательность из одной или нескольких команд, разделенных одним из управляющих операторов '|' или '| &'.
Да. Они сказали, что 1 команда - это конвейер. Поэтому все 3 из этих цитат говорят одно и то же.
$?
рассказывает, что случилось в последний раз.
- Это пузыри.
Мой ответ
Таким образом, хотя @Kambus продемонстрировал, что с такой простой функцией нет return
необходимости вообще. Я думаю, что это было нереально просто по сравнению с потребностями большинства людей, которые будут читать это.
Почему return
?
Если функция собирается возвращать статус завершения своей последней команды, зачем return
вообще ее использовать ? Потому что это приводит к прекращению выполнения функции.
Остановить выполнение в нескольких условиях
01 function i_should(){
02 uname="$(uname -a)"
03
04 [[ "$uname" =~ Darwin ]] && return
05
06 if [[ "$uname" =~ Ubuntu ]]; then
07 release="$(lsb_release -a)"
08 [[ "$release" =~ LTS ]]
09 return
10 fi
11
12 false
13 }
14
15 function do_it(){
16 echo "Hello, old friend."
17 }
18
19 if i_should; then
20 do_it
21 fi
Что у нас здесь есть ...
Строка 04
- это явное [-ish] возвращаемое значение true, потому что RHS &&
выполняется только в том случае, если LHS был истинным
Строка 09
возвращает true или false, соответствующие статусу строки08
Строка 13
возвращает ложь из-за строки12
(Да, это может быть проигнорировано, но весь пример придуман).
Еще одна распространенная модель
# Instead of doing this...
some_command
if [[ $? -eq 1 ]]; then
echo "some_command failed"
fi
# Do this...
some_command
status=$?
if ! $(exit $status); then
echo "some_command failed"
fi
Обратите внимание, как установка status
переменной демистифицирует значение $?
. (Конечно, вы знаете, что это $?
значит, но кто-то менее знающий, чем вы, когда-нибудь придет в Google. Если ваш код не занимается высокочастотной торговлей, проявите некоторую любовь , установите переменную.) Но реальная выгода заключается в том, что «если не существует статуса "или наоборот", если статус выхода "можно прочитать вслух и объяснить их значение. Однако последний может быть слишком амбициозным, потому что, увидев слово, exit
вы можете подумать, что он выходит из сценария, а в действительности он выходит из $(...)
подоболочки.
** Если вы абсолютно настаиваете на использовании return 1
для ложных, я предлагаю вам хотя бы использовать return 255
вместо этого. Это заставит вашего будущего себя или любого другого разработчика, который должен поддерживать ваш код, задать вопрос "почему это 255?" Тогда они, по крайней мере, будут обращать внимание и будут иметь больше шансов избежать ошибки.
function
ключевое слово,myfun() {...}
достаточно