Возвращающий логическое значение из функции в bash



Я хочу написать функцию bash, которая проверяет, имеет ли файл определенные свойства и возвращает true или false. Тогда я могу использовать его в своих скриптах в "если". Но что я должен вернуть?



function myfun(){ ... return 0; else return 1; fi;}


затем я использую его так:



if myfun filename.txt; then ...


конечно, это не сработает. Как это можно сделать?

583   5  

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"; fi

Edit

из комментария @amichair, это также возможно

isdirectory() {
  if [ -d "" ]
  then
    true
  else
    false
  fi
}


isdirectory() {
  [ -d "" ]
}

почему вы должны заботиться о том, что я говорю, несмотря на то, что есть 200-иш upvote ответ

дело не в этом 0 = true и 1 = false. Это: ноль означает отсутствие сбоя (успех) и ненулевой означает отказ (типа N).

в то время как выбранный ответ технически "правда" пожалуйста не ставить return 1** в коде ложные. Он будет иметь несколько нежелательные побочные эффекты.

  1. опытные разработчики определят вас как любителя (по причине ниже).
  2. опытные разработчики не делают этого (по всем причинам ниже).
  3. он подвержен ошибкам.
    • даже опытные разработчики могут ошибиться 0 и 1 как ложные и истинные соответственно (по причине выше).
  4. это требует (или будет поощрять) посторонних и смешных комментарии.
  5. это на самом деле менее полезно, чем неявные статусы возврата.

узнать некоторые Баш

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?"Тогда они, по крайней мере, будут обращать внимание и иметь больше шансов избегая ошибки.

myfun(){
    [ -d "" ]
}
if myfun "path"; then
    echo yes
fi
# or
myfun "path" && echo yes

будьте осторожны при проверке каталога только с опцией-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

    Ничего не найдено.