Вопрос о поведении оператора if

Стандартный способ сделать это - использовать двоеточие : :

if condition; do
  command
else
  :
fi

или true :

if condition; do
  command
else
  true
fi

Но почему бы просто не пропустить часть else :

if condition; do
  command
fi

В zsh и yash вы даже можете сделать else часть пуста:

if condition; then
  command
else
fi

1
12.04.2013, 07:28
2 ответа

Как уже говорилось if [ $(tmux has -t junk) ] расширяется до if [ ], что оценивается как false.

Вы можете использовать:

if tmux has -t junk; then
    echo OK
else
    echo ERR
fi

Или, если хотите короче:

tmux has -t junk || echo ERR

Или

tmux has -t junk && echo OK || echo ERR

Вы также можете отрицать его, если это более подходит, как в:

! tmux has -t junk || echo OK
! tmux has -t junk && echo ERR || echo OK
etc.

Edit:

Также не стоит забывать, что если команда производит вывод, то вы можете захотеть перенаправить этот вывод в вывод в черную дыру /dev/null, как в:

 if my_cmd >/dev/null; then echo OK else; echo ERR; fi

Если команда выдает текстовую ошибку, вы, возможно, захотите перенаправить стандартную ошибку также:

 if my_cmd >/dev/null 2>&1; then echo OK else; echo ERR; fi

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

Как уже упоминалось: $? - это единственный способ получить возвращаемое значение программы.

Некоторые программы варьируют return и могут иметь довольно явное значение.

Например, так:

mycmd
ecode=$?

case "$ecode" in
0) echo "Success";;
1) echo "Operation not permitted";;
2) echo "No such file or directory";;
esac

С помощью этого можно предпринять соответствующие действия при конкретных ошибках.

Если у вас установлен MySQL, вы можете сделать это, например, с помощью perror:

for i in {0..50}; do perror $i; done
# And
for i in {1000..1050}; do perror $i; done

чтобы получить представление об этом.

См. также этот ответ, связанный с ошибками, специфичными для ОС, который также содержит ссылки на документы Open Groups doc Error Numbers и errno.h.

Или посмотрите на SQLite и его расширенные.

2
29.04.2021, 00:49

Когда вы используете:

if [ $(tmux has -t junk) ]

Это проверяет вывод команды tmux имеет -t junk, но не возвращаемое значение.

Так как она всегда печатает единицу, как в первом случае, это означает, что команда tmux has -t junk ничего не печатает на стандартный вывод.

Поэтому в первом случае

if [ $(tmux has -t junk) ] 

вычисляется как

if [ ]
1
29.04.2021, 00:49

Теги

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