Я не знаком с хинду, но большинство дистрибутивов позволяет Вам устанавливать от диска, PXE, как был предложен @ewwhite, или если можно загрузиться от USB, Вы могли бы использовать Живую карту с интерфейсом USB.
Но я соглашаюсь, что Вы - вероятно, более обеспеченное получение заменяющего CD-ROM или даже DVD-привода. Можно получить Дисковод для компакт-дисков всего для 30$. Время Вы потратили бы попытку заставить Ваше предлагаемое решение работать, вероятно, намного более ценно, чем это.
Ответ @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
. Тем путем можно использовать возвращаемое значение для указания, "почему мы перестали работать" в случае возникновения отказов.
Функции в ударе могут только возвратить коды выхода. Замена команды, с другой стороны, используется для получения стандартного вывода команды или функции. Поэтому для проверки возвращенного флага Вам не нужна замена:
if valNum "$num" ; then
# ...
fi
Но, чтобы это работало, необходимо возвратиться 0, если номер является верным, и 1, если это не (код выхода 0 не означает ошибки).
if valnum "$num"
эквивалентно if valnum "$num" = 0
т.е., "если это верно". основное эмпирическое правило в сценариях sh то, что 0 = верно / успех, ненулевой = ложь/ошибка.
– cas
15.09.2013, 11:10
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")
Я лично получил противоречивые результаты в этой области. Вот результаты моих эмпирических экспериментов. Во-первых, некоторая « теория » о командах bash или * nix:
Пример:
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 - Сделать ...
Мы должны помнить, что мы проверяем коды ошибок в инструкции 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) означает истинное значение . Почему? На странице руководства сказано, что единственный аргумент - « истина », когда он НЕ-ПУСТО.
ссылки: