SHELL - И операция внутри оператора IF - PullRequest
2 голосов
/ 17 апреля 2019

Предполагая, что эти функции:

return_0() {
   return 0
}

return_1() {
   return 1
}

Тогда следующий код:

if return_0; then
   echo "we're in" # this will be displayed
fi

if return_1; then
   echo "we aren't" # this won't be displayed
fi

if return_0 -a return_1; then
   echo "and here we're in again" # will be displayed - Why ?
fi

Почему я вхожу в последнее if утверждение? Разве мы не должны выйти из состояния с этими 0 и 1?

Ответы [ 2 ]

4 голосов
/ 17 апреля 2019

При выполнении

if return_0 -a return_1; then
   echo "and here we're in again" # will be displayed - Why ?
fi

Вы выполняете строку return_0 -a return_1.Это фактически означает, что вы передаете -a и return_1 в качестве аргументов return_0.Если вы хотите выполнить операции и , вы должны использовать синтаксис &&.

if return_0 && return_1; then
   echo "and here we're in again" # will be displayed - Why ?
fi

Полезная информация, чтобы понять это:

И и ИЛИ списки - это последовательности одного или нескольких конвейеров, разделенных управляющими операторами && и || соответственно.Списки AND и OR выполняются с левой ассоциативностью.Список AND имеет форму

command1 && command2

command2, если и только если command1 возвращает нулевой статус выхода.

Список OR имеет форму

command1 || command2

command2 выполняется тогда и только тогда, когда command1 возвращает ненулевой статус выхода.Состояние возврата списков AND и OR - это состояние завершения последней команды, выполненной в списке.

4 голосов
/ 17 апреля 2019

-a - это одна из опций команды test (которая также реализуется [ и [[).Так что вы не можете просто использовать -a.Возможно, вы захотите использовать &&, который является токеном оператора управления для списка AND.

if return_0 && return_1; then ...

Вы можете использовать -a, чтобы сообщить test to "и "два разных test выражения, например

if test -r /file -a -x /file; then
    echo 'file is readable and executable'
fi

Но это эквивалентно

if [ -r /file -a -x /file ]; then ...

, которое может быть более читабельным, поскольку скобки делают test часть выражения яснее.

См. справочное руководство Bash для получения дополнительной информации о ...

...