Quick Boolean Primer for Bash
if
Oświadczenie wykonuje polecenie jako argument (jak zrobić &&
, ||
itp). Całkowity kod wyniku polecenia jest interpretowany jako wartość logiczna (0 / null = prawda, 1 / else = fałsz).
test
Oświadczenie bierze operatorów i operandów jako argumenty i zwraca kod wynikowy w takim samym formacie jak if
. Alias test
instrukcji to [
, który jest często używany if
do wykonywania bardziej złożonych porównań.
Instrukcje true
i false
nic nie robią i zwracają kod wyniku (odpowiednio 0 i 1). Można ich więc używać jako literałów logicznych w Bash. Ale jeśli umieścisz instrukcje w miejscu, w którym są interpretowane jako ciągi, napotkasz problemy. W Twoim przypadku:
if [ foo ]; then ... # "if the string 'foo' is non-empty, return true"
if foo; then ... # "if the command foo succeeds, return true"
Więc:
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;
Jest to podobne do zrobienia czegoś podobnego echo '$foo'
vs. echo "$foo"
.
W przypadku użycia test
instrukcji wynik zależy od użytych operatorów.
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)
Krótko mówiąc , jeśli po prostu chcesz przetestować coś jak pass / fail (aka „true” / „false”), a następnie przejść do polecenia if
lub &&
itp oświadczenie, bez nawiasów. W przypadku złożonych porównań użyj nawiasów z odpowiednimi operatorami.
I tak, zdaję sobie sprawę że nie ma czegoś takiego jak natywny typu boolean w bash, a if
i [
i true
są technicznie „polecenia”, a nie „oświadczenia”; to tylko bardzo podstawowe, funkcjonalne wyjaśnienie.