Я хочу написать функцию bash, которая проверяет, имеет ли файл определенные свойства, и возвращает true или false. Затем я могу использовать его в своих сценариях в «если». Но что я должен вернуть?
function myfun(){ ... return 0; else return 1; fi;}
тогда я использую это так:
if myfun filename.txt; then ...
конечно это не работает. Как это можно сделать?
function
ключевое слово,myfun() {...}
достаточноif
это статус нулевого выходаmyfun
: если выполняетсяmyfun
с0
,then ...
выполняется; если это что-то ещеelse ...
выполняется.function
ключевое слово является bashism и приведет к ошибкам синтаксиса в некоторых других оболочках. По сути, это либо ненужно, либо запрещено, так зачем его использовать? Он даже не полезен в качестве цели grep, поскольку его там может и не быть (()
вместо этого grep ).Ответы:
Используйте 0 для истины и 1 для ложных.
Образец:
редактировать
Из комментария @ amichair это также возможно
источник
[ -d "$1" ]
.Почему вы должны заботиться о том, что я говорю, несмотря на то, что есть ответ 250+ upvote
Дело не в этом
0 = true
а1 = false
. Это: ноль означает отсутствие отказа (успех) и ненулевое значение означает отказ (типа N) .Хотя выбранный ответ является технически «верным», пожалуйста , не ставьте
return 1
** в своем коде для ложного . У него будет несколько неприятных побочных эффектов.Узнайте немного
Руководство Bash говорит (выделено мое)
Поэтому нам не нужно НИКОГДА использовать 0 и 1 для обозначения True и False. Тот факт, что они делают это, является по существу тривиальным знанием, полезным только для отладки кода, вопросов об интервью и для того, чтобы поразить умы новичков.
Руководство Bash также говорит
Руководство Bash также говорит
Ой, подожди. Трубопровод? Давайте вернемся к руководству по bash еще раз.
Да. Они сказали, что 1 команда - это конвейер. Поэтому все 3 из этих цитат говорят одно и то же.
$?
рассказывает, что случилось в последний раз.Мой ответ
Таким образом, хотя @Kambus продемонстрировал, что с такой простой функцией нет
return
необходимости вообще. Я думаю, что это было нереально просто по сравнению с потребностями большинства людей, которые будут читать это.Почему
return
?Если функция собирается возвращать статус завершения своей последней команды, зачем
return
вообще ее использовать ? Потому что это приводит к прекращению выполнения функции.Остановить выполнение в нескольких условиях
Что у нас здесь есть ...
Строка
04
- это явное [-ish] возвращаемое значение true, потому что RHS&&
выполняется только в том случае, если LHS был истиннымСтрока
09
возвращает true или false, соответствующие статусу строки08
Строка
13
возвращает ложь из-за строки12
(Да, это может быть проигнорировано, но весь пример придуман).
Еще одна распространенная модель
Обратите внимание, как установка
status
переменной демистифицирует значение$?
. (Конечно, вы знаете, что это$?
значит, но кто-то менее знающий, чем вы, когда-нибудь придет в Google. Если ваш код не занимается высокочастотной торговлей, проявите некоторую любовь , установите переменную.) Но реальная выгода заключается в том, что «если не существует статуса "или наоборот", если статус выхода "можно прочитать вслух и объяснить их значение. Однако последний может быть слишком амбициозным, потому что, увидев слово,exit
вы можете подумать, что он выходит из сценария, а в действительности он выходит из$(...)
подоболочки.** Если вы абсолютно настаиваете на использовании
return 1
для ложных, я предлагаю вам хотя бы использоватьreturn 255
вместо этого. Это заставит вашего будущего себя или любого другого разработчика, который должен поддерживать ваш код, задать вопрос "почему это 255?" Тогда они, по крайней мере, будут обращать внимание и будут иметь больше шансов избежать ошибки.источник
if
успех, сделай это,else
сделай это». Успех в чем? Может быть проверка на истину / ложь, может быть проверка на строку, целое число, файл, каталог, права на запись, glob, regex, grep или любую другую команду, которая подвержена сбоям .true
иfalse
команд. Таким образом, ключевое словоtrue
буквально оценивается как код состояния 0. Кроме того, операторы if-then по своей природе оперируют логическими значениями, а не кодами успеха. Если во время логической операции возникает ошибка, она не должна возвращать true или false, а просто прерывать выполнение. В противном случае вы получите ложные срабатывания (каламбур).return 1
следует избегать использования. Предполагая, что у меня естьvalidate
функция, я считаю разумным,return 1
если проверка не пройдена. В конце концов, это является причиной, чтобы остановить выполнение скрипта, если он не обрабатывается должным образом (например, при использованииset -e
).return 1
это действительно. Меня беспокоят все комментарии, в которых говорится: «0 = истина 1 = ложь - это [вставить отрицательное слово]». Эти люди, вероятно, когда-нибудь прочитают ваш код. Таким образом, для них видениеreturn 255
(или 42 или даже 2) должно помочь им больше думать об этом и не принимать это за «истину».set -e
все равно поймаю это.источник
Будьте внимательны при проверке каталога только с опцией -d!
если переменная $ 1 пуста, проверка все равно будет успешной. Чтобы быть уверенным, проверьте также, что переменная не пуста.
источник
$1
("$1"
), вам не нужно проверять пустую переменную.[[ -d "$1" ]]
Потерпит неудачу , потому что это""
не является каталогом.Я столкнулся с моментом (еще явно не упомянутым?), На который я наткнулся. То есть не как вернуть логическое значение, а как правильно его оценить!
Я пытался сказать
if [ myfunc ]; then ...
, но это просто неправильно. Вы не должны использовать скобки!if myfunc; then ...
это способ сделать это.Как и у @Bruno, и другие повторяются,
true
иfalse
это команды , а не значения! Это очень важно для понимания логических значений в сценариях оболочки.В этом посте я объяснил и продемонстрировал с помощью логических переменных : https://stackoverflow.com/a/55174008/3220983 . Я настоятельно рекомендую проверить это, потому что это так тесно связано.
Здесь я приведу несколько примеров возврата и оценки логических значений из функций:
Это:
Не выдает эхосигнала. (т.е.
false
возвращает ложь)Производит:
(т.е.
true
возвращает истину)И
Производит:
Потому что 0 (то есть истина) был возвращен неявно .
Теперь это то, что напортачило мне ...
Производит:
И
ТАКЖЕ производит:
Использование скобок здесь дает ложный положительный результат ! (Я предполагаю, что «внешний» результат команды равен 0.)
Основной вывод из моего поста заключается в следующем: не используйте скобки для оценки логической функции (или переменной), как для обычной проверки на равенство, например
if [ x -eq 1 ]; then...
!источник
Используйте команды
true
илиfalse
непосредственно перед вашимreturn
, затемreturn
без параметров.return
Будет автоматически использовать значение последней команды.Предоставление аргументов для
return
является непоследовательным, специфичным для типа и подверженным ошибкам, если вы не используете 1 или 0. И, как уже говорилось в предыдущих комментариях, использование 1 или 0 здесь не является правильным способом приблизиться к этой функции.Вывод:
источник
Это может сработать, если переписать это
function myfun(){ ... return 0; else return 1; fi;}
такfunction myfun(){ ... return; else false; fi;}
. То есть, еслиfalse
это последняя инструкция в функции, вы получаете ложный результат для всей функции, но вreturn
любом случае прерываете функцию с истинным результатом. Я верю, что это правда, по крайней мере, для моего переводчика bash.источник
Я нашел самую короткую форму для проверки выхода функции просто
источник
По причинам читабельности кода, я считаю, что возвращение true / false должно:
return
за которым следует другое ключевое слово (true
илиfalse
)Мое решение
return $(true)
илиreturn $(false)
как показано:источник
Следуя @Bruno Bronosky и @mrteatime, я предлагаю вам просто написать булево возвращение «назад». Это то, что я имею в виду:
Это устраняет уродливое требование в две строки для каждого оператора return.
источник