Задать вопрос

bash. Почему if [ 0 ] истина, а if [ 1 ] ложь?

В силу определенных обстоятельств необходимо написать скрипт на bash, Ранее писал на С, PHP.
В php подобная конструкция выполнится верно, ибо 0 есть ничто/ничего (но 0 не NULL, хотя и с результатом NULL if не выполнится), а 1 выполнится в любом случае, ибо 1 это что-то существующее (число или строка) и не является «ничем».

Докопался я до этого в неправильных обработках вложенных циклов if (вложенные циклы выполнялись всегда, независимо от того, что я задавал в качестве условия. Например, условия [ 1>2 ] и [ let «3<2» ] всегда true и запускают вложенность then.

Подобное упоминание я нашел и здесь, где самая интересная вырезка:
#!/bin/bash
if [ 0 ] # ноль
then echo "0 -- это истина."
else echo "0 -- это ложь."
fi
# 0 -- это истина.

if [ 1 ] # единица
then echo "1 -- это истина."
else echo "1 -- это ложь."
fi
# 1 -- это ложь.

if [ -1 ] # минус один
then echo "-1 -- это истина."
else echo "-1 -- это ложь."
fi
# -1 -- это истина.


В нормальных мануалах описывается почему условия возвращают тот или иной результат. Я не смог найти описания почему такова логика работы. Почему так происходит?
  • Вопрос задан
  • 7143 просмотра
Подписаться 3 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 3
afiskon
@afiskon
Короче — в современных ОС если программа завершается успешно, она возвращает 0, иначе — код ошибки, который больше нуля. Вот по-этому.
Ответ написан
@gribozavr
man bash
/test

1 argument
The expression is true if and only if the argument is not null.

$ [ 0 ] && echo true
true
$ [ 1 ] && echo true
true
$ [ -1 ] && echo true
true
$ [ "" ] && echo true
$
Ответ написан
Комментировать
@avatar29
if [ 1 ] # единица
then echo "1 -- это истина."
else echo "1 -- это ложь."
fi
# 1 -- это ложь

Неверно, 1 это истина.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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