Как ключевое слово «если» проверяет, является ли значение истинным или ложным? - PullRequest
10 голосов
/ 13 октября 2010

В bash-скрипте

if [ 1 ]
then
   echo "Yes"
else
   echo "No"
fi

Выход: Yes

Это означает, что «1» рассматривается как истинное значение.

Но в коде:

word = Linux
letter = nuxi
if echo "$word" | grep -q "$letter"
then
    echo "Yes"
else
    echo "No"
fi

Выход: No

Но echo "$word" | grep -q "$letter" вернет 1, так почему результат равен No.

Как ключевое слово if проверяет значение, возвращаемое командой после if?

Ответы [ 3 ]

13 голосов
/ 13 октября 2010

Возвращаемое значение команды проверяется. [ 1 ] имеет возвращаемое значение 0 (true). Любое другое возвращаемое значение (например, 1) указывает на ошибку.

Вы можете отобразить возвращаемое значение последней выполненной команды, используя переменную $?:

true
echo $?
# returned 0
false
echo $?
# returned 1
echo $?
# returned 0 as the last executed command is 'echo', and not 'false'
9 голосов
/ 13 октября 2010

В земле Unix, 0 - это истина, а 1 - это ложь.

Для вашего первого примера:

if [ 1 ]
then
   echo "Yes"
else
   echo "No"
fi

«If» проверяет код выхода данной команды на true / false (т. Е. Ноль / не ноль).

Квадратные скобки фактически вызывают команду «test» (см. «Man test» для получения дополнительной информации) и присваивают код выхода if.

«test 1» (или действительно «test any_string») возвращает true (0), поэтому выводится «Yes».

Для вашего второго примера выводится «Нет», поскольку «nuxi» не найден в «Linux», если вы измените «nuxi» на «nux» (возможно, это была опечатка?) И удалите пробелы вокруг = тогда вы получите поведение, которое вы ожидаете. например,

word=Linux
letter=nux
if echo "$word" | grep -q "$letter"
then
    echo "Yes"
else
    echo "No"
fi
0 голосов
/ 13 октября 2010

Это связано с тем, что grep не удалось найти букву $ в $ word, поэтому код выхода равен 1. Когда процесс в linux возвращает код, отличный от 0, это означает, что произошел сбой. 0 означает успешное завершение. Вы можете проверить это по echo "Linux" | grep -d "nuxi"; echo $?

С другой стороны, в мире сценариев 0 означает ложь, а 1 означает истину. Так что grep не удалось найти слово и отправить 1 в качестве кода выхода в if, который принял его как истинное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...