Возвращение значения от функции удара

Я не знаком с хинду, но большинство дистрибутивов позволяет Вам устанавливать от диска, PXE, как был предложен @ewwhite, или если можно загрузиться от USB, Вы могли бы использовать Живую карту с интерфейсом USB.

Но я соглашаюсь, что Вы - вероятно, более обеспеченное получение заменяющего CD-ROM или даже DVD-привода. Можно получить Дисковод для компакт-дисков всего для 30$. Время Вы потратили бы попытку заставить Ваше предлагаемое решение работать, вероятно, намного более ценно, чем это.

10
15.09.2013, 11:19
4 ответа

Ответ @choroba корректен, однако этот пример мог бы быть более ясным:

valNum $num
valNumResult=$? # '$?' is the return value of the previous command
if [[ $valNumResult -eq 1 ]]
then
  : # do something
fi

Этот пример немного дольше (установка $valNumResult затем запрашивая то значение), но больше явно описывает то, что происходит: это valNum() возвращает значение, и то значение может быть запрошено и протестировано.

P.S. Сделайте себе одолжение и возврат 0 для true и ненулевой для false. Тем путем можно использовать возвращаемое значение для указания, "почему мы перестали работать" в случае возникновения отказов.

14
27.01.2020, 19:59

Функции в ударе могут только возвратить коды выхода. Замена команды, с другой стороны, используется для получения стандартного вывода команды или функции. Поэтому для проверки возвращенного флага Вам не нужна замена:

if valNum "$num" ; then
    # ...
fi

Но, чтобы это работало, необходимо возвратиться 0, если номер является верным, и 1, если это не (код выхода 0 не означает ошибки).

8
27.01.2020, 19:59
  • 1
    псевдонима, я не получаю ее. В примере 24.7 в tldp.org/LDP/abs/html/complexfunct.html функция возвращает макс. значение а не код выхода. Хотя Ваше предложение работает, но я не могу понять, почему оно работает –  user2179293 15.09.2013, 10:44
  • 2
    начиная с Вашего теста должен узнать, является ли вход допустимым 10-разрядным целым числом или нет, т.е. TRUE или FALSE, функция возвращается или 0 или 1. пример choroba работает потому что if valnum "$num" эквивалентно if valnum "$num" = 0 т.е., "если это верно". основное эмпирическое правило в сценариях sh то, что 0 = верно / успех, ненулевой = ложь/ошибка. –  cas 15.09.2013, 11:10
  • 3
    BTW, который "Усовершенствованное Руководство по созданию сценариев Bash" не является очень хорошим руководством - это неправильно относительно большого количества вещей и поощряет некоторые плохие методы сценариев. Bash FAQ по mywiki.wooledge.org/BashFAQ является намного лучшим ресурсом. –  cas 15.09.2013, 11:12
  • 4
  • 5
    , который приводит к сбою Ваша функция, потому что это повторяет строку "Неверный номер" и Вы, затем делая числовое сравнение между той строкой и номером 1 с if [[ $(valNum $num) -eq 1 ]] –  cas 15.09.2013, 11:19

Вы не можете возвратить произвольный результат функции оболочки. Можно только возвратить код состояния, который является целым числом между 0 и 255. (В то время как можно передать большее значение return, это - усеченные 256 по модулю.) Значение должно быть 0 для указания на успех и другое значение для указания на отказ; условно необходимо придерживаться кодов ошибок между 1 и 125, поскольку более высокие значения имеют особое значение (плохая внешняя команда для 126 и 127, уничтоженный сигналом для более высоких значений).

Так как Вы возвращаете результат yes-no сюда, код состояния является соответствующим. С тех пор flag кажется, указывает на успешность или неуспешность, необходимо использовать стандартные значения 0 для успеха и 1 для отказа (противоположность того, что Вы записали). Можно затем использовать функцию непосредственно в если оператор.

valNum ()
{
  local flag=0
  if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then
    echo 1>&2 "Invalid Number"
    flag=1
  fi
  return $flag
}
if valNum "$num"; then
  #do something
fi

Если необходимо различить между кодами неисправности, вызовите функцию непосредственно. Сразу после того, как это возвращается, код неисправности доступен в $?. Можно затем проверить его с оператором выбора:

valNum "$num"
case $? in …

Если необходимо использовать код состояния позже, сохраните его в другую переменную прежде $? перезаписывается следующей командой.

valNum "$num"
valNum_status=$?

То, что Вы записали, не работало потому что замена команды $(…) расширяется до вывода функции, которая в Вашем коде является или сообщением об ошибке или пустой, никогда 1.

Если необходимо передать больше информации, чем код состояния позволяет из функций оболочки, у Вас есть две возможности:

  • Распечатайте некоторый текст на стандартном выводе и вызовите функцию в замене команды: $(valNum "$num")
  • Присвойте одному или нескольким переменную в функции и считайте те переменные позже.
5
27.01.2020, 19:59

Я лично получил противоречивые результаты в этой области. Вот результаты моих эмпирических экспериментов. Во-первых, некоторая « теория » о командах bash или * nix:

  • SUCCESS == 0 ... а именно. нет кода состояния ошибки)
  • FAIL! = 0 ...... некоторый код состояния

Пример:

if  ls -lt /nonexistantdir
then 
    echo "found"
else
    echo "FAIL"
fi
#
echo
ls -lt /nonexistantdir; echo "status = $?"
echo "status = $?"

Вывод:

ls: cannot access '/nonexistantdir': No such file or directory
FAIL... 

ls: cannot access '/nonexistantdir': No such file or directory
status = 2

Как показано, команда ls возвращает код состояния = 2. Когда вы пытаетесь найти действительный каталог, статус равен нулю ( 0 ). Не то же самое, что почти все другие языки.

правило # 1 - Сделать ...

  • ИСТИНА == 0
  • ЛОЖЬ! = 0

Мы должны помнить, что мы проверяем коды ошибок в инструкции Bash if . Я установил константы, или вы можете использовать команды оболочки true или false .

TRUE=0
FALSE=1

#  valid number function
#
valNum()
{
    flag=$TRUE

    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=$FALSE
    fi
    return $flag
}

#    later on ...
#
if validNum Abc 
then
    echo "Lucky number"
else
    echo "Not lucky."
fi

и вывод:

Invalid Number
Not lucky.

Тем не менее, я предлагаю вам проголосовать « за » @Gilles, потому что его ответ правильный. Я просто хотел упростить ePaper.

Еще одна вещь, команда test . Это выглядит так:

[[ some-expression ]]; 

В большинстве случаев. И например:

$ test 1
$ echo "result = $?"
result = 0
$ test 0
$ echo "result = $?"
result = 0

Ноль (0) означает истинное значение . Почему? На странице руководства сказано, что единственный аргумент - « истина », когда он НЕ-ПУСТО.

ссылки:

2
27.01.2020, 19:59

Теги

Похожие вопросы