Быстрый булев праймер для Bash
if
Оператор принимает команду в качестве аргумента (как &&
,||
и т.д.). Целочисленный код результата команды интерпретируется как логическое значение (0 / null = true, 1 / else = false).
test
Оператор принимает операторы и операнды в качестве аргументов и возвращает код результата в том же формате, что и if
. Псевдоним test
оператора [
, который часто используется сif
для выполнения более сложных сравнений.
Операторы true
и false
ничего не делают и возвращают код результата (0 и 1 соответственно). Таким образом, они могут быть использованы как логические литералы в Bash. Но если вы поместите операторы в место, где они интерпретируются как строки, вы столкнетесь с проблемами. В твоем случае:
if [ foo ]; then ... # "if the string 'foo' is non-empty, return true"
if foo; then ... # "if the command foo succeeds, return true"
Так:
if [ true ] ; then echo "This text will always appear." ; fi;
if [ false ] ; then echo "This text will always appear." ; fi;
if true ; then echo "This text will always appear." ; fi;
if false ; then echo "This text will never appear." ; fi;
Это похоже на что-то вроде echo '$foo'
против echo "$foo"
.
При использовании test
оператора результат зависит от используемых операторов.
if [ "$foo" = "$bar" ] # true if the string values of $foo and $bar are equal
if [ "$foo" -eq "$bar" ] # true if the integer values of $foo and $bar are equal
if [ -f "$foo" ] # true if $foo is a file that exists (by path)
if [ "$foo" ] # true if $foo evaluates to a non-empty string
if foo # true if foo, as a command/subroutine,
# evaluates to true/success (returns 0 or null)
Короче говоря , если вы просто хотите протестировать что-то как pass / fail (иначе «true» / «false»), то передайте команду в свой оператор if
или &&
т. Д. Без скобок. Для сложных сравнений используйте скобки с соответствующими операторами.
И да, я знаю, что в Bash нет такого понятия, как родной логический тип, и что if
и, [
и true
с технической точки зрения это «команды», а не «операторы»; это просто очень простое, функциональное объяснение.