Почему скрипт bash, использующий if и grep, работает один раз при каждом вызове? - PullRequest
1 голос
/ 17 февраля 2020
root@xxx:/#  [ "`date | grep 20 | echo $?`" -gt "0" ] && echo 12
root@xxx:/#  [ "`date | grep 20 | echo $?`" -gt "0" ] && echo 12
12
root@xxx:/#  [ "`date | grep 20 | echo $?`" -gt "0" ] && echo 12
root@xxx:/#  [ "`date | grep 20 | echo $?`" -gt "0" ] && echo 12
12
root@xxx:/#  [ "`date | grep 20 | echo $?`" -gt "0" ] && echo 12
root@xxx:/#  [ "`date | grep 20 | echo $?`" -gt "0" ] && echo 12
12

Оно должно отображать 12 в каждой строке, но только в нечетных строках. Почему? Как исправить?

1 Ответ

5 голосов
/ 17 февраля 2020

Вы предполагаете, что foo | echo $? покажет статус выхода foo. Это не вариант. Вместо этого он показывает состояние выхода предыдущей команды или конвейера:

$ bash -c 'exit 42'
$ true | echo $?
42

Поэтому ваша команда работает так:

$ [ $? = 1 ] && echo "Boop"
$ [ $? = 1 ] && echo "Boop"
Boop
$ [ $? = 1 ] && echo "Boop"
$ [ $? = 1 ] && echo "Boop"
Boop

То, что вы намеревались подавить grep output (здесь сделано с -q), а затем добавить вторую команду (после ;), которая может записать значение:

# Check for success when running a command and writing out
# the exit status and capturing it and comparing it to success
[ "`date | grep -q 20; echo $?`" -gt "0" ] && echo 12

Однако вы можете удалить все избыточности и просто делать:

# Check for success when running a command
date | grep -q 20 && echo 12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...