2013-08-08 5 views
2

Я очень тупой проблему, но не могу обернуть мою голову вокруг негоИЛИ логический оператор в Баш

if [[ false || false ]] ; then 
     echo 'true' 
else 
     echo 'false' 
fi 

По http://tldp.org/LDP/abs/html/comparison-ops.html

-o логическое или

exp1 -o exp2 возвращает true, если значение exp1 или exp2 истинно.

Это похожие на операторы сравнения Bash & & и ||, использовано в двойных скобках. [[Condition1 & & condition2]]

так, если оба ложны, то он должен вернуться ложным? то почему он печатает «правда»?

ответ

4

Вы должны работать те, а не как часть условной команды '[[]]':

if false || false; then 
     echo 'true' 
else 
     echo 'false' 
fi 

Что касается тестирования falses внутри [[и]]:

if [[ ! 1 || ! 1 ]]; then 
     echo 'true' 
else 
     echo 'false' 
fi 

, что отмечая [ [false]] эквивалентно [[-n false]], что делает истинное условие.

Если вы хотите, вы могли бы сделать более очевидный и правильный условный тест с()(), как это:

if ((0 || 0)); then 
     echo 'true' 
else 
     echo 'false' 
fi 
+1

'' '' (пустая строка), вероятно, является более каноническим ложным значением в 'bash'; обратите внимание, что '! 0' является столь же ложным в этом контексте, как '! 1'. – chepner

4

"false" не является ложным. «false» - это непустая строка. Непустые строки истинны по умолчанию в [[.

+1

«ложный» не является ключевым словом в '[['. –

Смежные вопросы