Как ключевое слово "если" проверяет, является ли значение истинным или ложным?

В скрипте 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" echo "$word" | grep -q "$letter" вернет 1, так почему результат - No.

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

Ответ 1

Проверяется возвращаемое значение команды. [ 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'

Ответ 2

В unix land, 0 истинно, а 1 - false.

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

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

"Если" проверяет код выхода данной команды на значение true/false (т.е. ноль/ненулевое значение).

Квадратные скобки на самом деле вызывают команду "тест" (см. "man test" для получения дополнительной информации) и укажите код выхода, если.

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

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

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

Ответ 3

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

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