Различные способы использования условного оператора if [duplicate]

Вы не можете получить доступ к MAC address, хотя вы можете получить IP address пользователя




Ссылка: (См. здесь ).

51
задан Gilles Quenot 17 March 2013 в 14:30
поделиться

2 ответа

Проверенные вами тесты:

  • Одиночная скобка - (...) создает подоболочку
  • Double Parenthesis - ((...)) для арифметическая операция
  • Single Square Bracket - [...] - синтаксис для двухпозиционных скобок POSIX test
  • - [[...]] является синтаксисом для bash условные выражения (похожие на test, но более мощные)

не являются исчерпывающими, вы можете использовать логическую логику

if command; then ...

тоже , потому что команды имеют статус выхода. В bash, 0 - true, а 0 - false.

Вы можете видеть статус выхода следующим образом:

command
echo $?

См.

http://wiki.bash-hackers.org/syntax/basicgrammar http://wiki.bash-hackers.org/syntax/arith_expr http://mywiki.wooledge.org/BashGuide/TestsAndConditionals

56
ответ дан Gilles Quenot 21 August 2018 в 04:32
поделиться
  • 1
    $? не является точно возвращаемым значением, это фактически статус выхода; 0 означает успех, а 1 - неудачу, которую вы можете интерпретировать как истину и ложь. – Edouard Thiel 17 March 2013 в 15:08
  • 2
    Замещенное "возвращаемое значение" по «статусу выхода», справа, но сбой составляет не только 1, но и весь статус & gt; 0, как написано в моем сообщении. – Gilles Quenot 17 March 2013 в 15:43
  • 3
    Пример: curl /dev/null выход с 3 – Gilles Quenot 17 March 2013 в 15:49
  • 4
    Конечно, вы правы. – Edouard Thiel 17 March 2013 в 15:54
  • 5
    @sputnick На самом деле, отказ - это все статус! = 0 - возможны отрицательные значения выхода. – twalberg 5 June 2013 в 22:12

Сама оболочка запускает только команду и оценивает ее код выхода. Код нулевого выхода означает успех; все другие значения указывают на сбой.

if command; then
    : things to do if the exit code from command was 0
else
    : things to do if it was not 0
fi

while command; do
    : things to do if the exit code was 0
done

Команда [ (aka test) очень часто используется в условных выражениях, поскольку в исходной оболочке Bourne не было встроенных операторов, чтобы проверить, была ли строка пустым или файлом. У современных оболочек встроена эта команда, и у многих оболочек есть расширенная и модернизированная версия [[, но это не является должным образом переносимым для POSIX sh, и поэтому ее следует избегать для портативных скриптов. Этот связанный вопрос более подробно объясняет различия между ними.

Обозначение (( ... )) вводит арифметический контекст. Опять же, это было не что-то, что не было частью оригинальной оболочки Bourne (для этого было специальное средство expr), но в современных оболочках это встроено. Код результата арифметического выражения равен 0, если результат арифметическая оценка не была 0 (или ошибкой).

Обозначение ( command ) создает подоболочку и оценивает command. Бывают ситуации, когда это действительно необходимо и полезно, но если вы просто изучаете синтаксис, вам вряд ли понадобится это.

... На самом деле, в большинстве сценариев я видел, что это использовалось в условном выражении, это явно не нужно.

Еще один антипаттерн, который нужно искать, -

command
if [ $? = 0 ]; then
    : things
fi

Вы почти никогда не должны явно изучать $?, и, в частности, сравнение его с нолем - это нечто if и while , особенно , для вас за кулисами. Это должно быть просто рефакторировано

if command; then
    : ...
1
ответ дан tripleee 21 August 2018 в 04:32
поделиться