4 ответов:
вы находитесь под управлением
[(Он жеtest) команда с аргументом "false", не выполняющая командуfalse. Поскольку "false" является непустой строкой, тоtestкоманда всегда выполняется успешно. Чтобы фактически выполнить команду, отбросьте
быстрый логический праймер для Bash
The
ifоператор принимает команду в качестве аргумента (как и&&,||и т. д.). Целочисленный результирующий код команды интерпретируется как логическое значение (0 / null=true, 1/else=false).The
testоператор принимает операторы и операнды в качестве аргументов и возвращает код результата в том же формате какif. Псевдонимtestзаявление[, который часто используется сifдля выполнения более сложных сравнений.The
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 (aka "true"/"false"), то передайте команду своему
ifили&&etc. заявление, без скобок. Для сложных сравнений используйте скобки с соответствующими операторами.и да, я знаю, что нет такой вещи, как родной логический наберите в Баш, а то
ifи[иtrueявляются технически "командами", а не "утверждениями"; это просто очень простое, функциональное объяснение.
Я обнаружил, что я могу сделать некоторые основные логики, запустив что-то вроде:
A=true B=true if ($A && $B); then C=true else C=false fi echo $C
С помощью true / false удаляет некоторые скобки беспорядок...
#! /bin/bash # true_or_false.bash [ "$(basename )" == "bash" ] && sourced=true || sourced=false $sourced && echo "SOURCED" $sourced || echo "CALLED" # Just an alternate way: ! $sourced && echo "CALLED " || echo "SOURCED" $sourced && return || exit
Comments