Возвращающий логическое значение из функции в bash
Я хочу написать функцию bash, которая проверяет, имеет ли файл определенные свойства и возвращает true или false. Тогда я могу использовать его в своих скриптах в "если". Но что я должен вернуть?
function myfun(){ ... return 0; else return 1; fi;}
затем я использую его так:
if myfun filename.txt; then ...
конечно, это не сработает. Как это можно сделать?
5 ответов:
используйте 0 для true и 1 для false.
пример:
#!/bin/bash isdirectory() { if [ -d "" ] then # 0 = true return 0 else # 1 = false return 1 fi } if isdirectory ; then echo "is directory"; else echo "nopes"; fiEdit
из комментария @amichair, это также возможно
isdirectory() { if [ -d "" ] then true else false fi } isdirectory() { [ -d "" ] }
почему вы должны заботиться о том, что я говорю, несмотря на то, что есть 200-иш upvote ответ
дело не в этом
0 = trueи1 = false. Это: ноль означает отсутствие сбоя (успех) и ненулевой означает отказ (типа N).в то время как выбранный ответ технически "правда" пожалуйста не ставить
return 1** в коде ложные. Он будет иметь несколько нежелательные побочные эффекты.
- опытные разработчики определят вас как любителя (по причине ниже).
- опытные разработчики не делают этого (по всем причинам ниже).
- он подвержен ошибкам.
- даже опытные разработчики могут ошибиться 0 и 1 как ложные и истинные соответственно (по причине выше).
- это требует (или будет поощрять) посторонних и смешных комментарии.
- это на самом деле менее полезно, чем неявные статусы возврата.
узнать некоторые Баш
The руководство bash говорит (выделено мной)
return [n]
вызвать функцию консоли, чтобы остановить выполнение и возвращает значение N, чтобы вызывающий его код. если n не поставлено возвращаемое значение является состояние выхода последней выполненной команды в функция.
таким образом, мы никогда не должны использовать 0 и 1, чтобы указать истину и ложь. Тот факт, что они делают это, по сути, тривиальное знание, полезное только для отладки кода, вопросов интервью и взрыва умов новичков.
руководство bash и говорит
в противном случае функция возвращает статус состояние выхода последней выполненной команды
Баш руководство и говорит
($?) расширяется до состояние выхода из последнего выполненного конвейера переднего плана.
Эй, подожди. Трубопровод? Давайте обратитесь к руководству bash еще раз.
конвейер-это последовательность одна или несколько команд разделены одним из операторов управления ' |‘или’/&'.
да. Они сказали, что 1 команда-это конвейер. Поэтому все 3 из этих цитат говорят одно и то же.
$?рассказывает вам, что произошло в последний раз.- он пузырится.
мой ответ:
Итак, в то время как @Kambus продемонстрировал, что с такой простой функцией нет
returnнужна вообще. Я думаю, что демонстрация @Erik была нереально простой по сравнению с потребностями большинства людей, которые будут читать это.почему
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 было trueстрока
09возвращает значение true или false, соответствующее статус строки08строка
13возвращает false из-за строки12(Да, это может быть golfed вниз, но весь пример надуман.)
еще один общий шаблон
# 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переменная демистифицирует значение$?. Но реальный вынос заключается в том, что "если не существует статуса" или, наоборот, "если статус выхода" можно прочитать вслух и объяснить их значение. , этот последний может быть слишком амбициозным, потому что видит словоexitможет заставить вас думать, что он выходит из сценария, когда на самом деле он выходит из$(...)subshell.
** - если вы настаиваете на использовании
return 1для false, я предлагаю вам по крайней мере использоватьreturn 255вместо. Это заставит ваше будущее " я "или любого другого разработчика, который должен поддерживать ваш код, спросить:" почему это 255?"Тогда они, по крайней мере, будут обращать внимание и иметь больше шансов избегая ошибки.
будьте осторожны при проверке каталога только с опцией-d !
если переменная $1 пуста, проверка все равно будет успешной. Чтобы быть уверенным, проверьте, что переменная не пуста.#! /bin/bash is_directory(){ if [[ -d ]] && [[ -n ]] ; then return 0 else return 1 fi } #Test if is_directory ; then echo "Directory exist" else echo "Directory does not exist!" fi
это может сработать, если вы перепишите это
function myfun(){ ... return 0; else return 1; fi;}Как этоfunction myfun(){ ... return; else false; fi;}. То есть еслиfalseэто последняя инструкция в функции вы получаете ложный результат для всей функции, ноreturnпрерывает функцию с истинным результатом в любом случае. Я считаю, что это правда, по крайней мере, для моего переводчика bash.
Comments