Что делать, если <command>;[$?= 4];тогда <...> делать? - PullRequest
1 голос
/ 11 марта 2019

Я наткнулся на этот фрагмент кода и спросил себя о его значении:

if `getopt -T >/dev/null 2>&1` ; [ $? = 4 ]
then
#do a thing 
else
#do the other thing
fi

Что меня раздражает, так это [$? = 4] часть. Это похоже на тест для кода завершения последней команды, который имеет смысл, так как "#do a thing" и "#do другой объект" относятся к тому, как работать с различными версиями getopt, но оценивается ли он вообще? Если так, то как? Я никогда не видел такого утверждения после ключевого слова if.

Спасибо!

1 Ответ

2 голосов
/ 11 марта 2019

Давайте рассмотрим вывод help if:

if: if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi
   The `if COMMANDS' list is executed.  If its exit status is zero, then the
   `then COMMANDS' list is executed.  Otherwise, each `elif COMMANDS' list is
   executed in turn, and if its exit status is zero, the corresponding
   `then COMMANDS' list is executed and the if command completes.  Otherwise,
   the `else COMMANDS' list is executed, if present.  The exit status of the
   entire construct is the exit status of the last command executed, or zero
   if no condition tested true.

В свете вышесказанного рассмотрим следующее:

  • if COMMANDS; then ... особенно принимает COMMANDS - список, который может состоять из нескольких команд, объединенных разделителями.
  • foo; bar - это список команд, который запускает как foo, так и bar;после ее завершения состояние выхода составной команды будет таким: bar.
  • [ $? = 4 ] проверяет, точно ли состояние выхода непосредственно предшествующей программы равно 4.
  • getopt -T >/dev/null 2>&1; [ $? = 4 ], таким образом проверяетвыходит ли getopt -T со статусом точно 4.

Таким образом, ваш код запускает блок #do a thing, если getopt -T завершается неудачно с состоянием выхода 4, и #do the other thing в противном случае.

...