逻辑运算符的工作原理

How logical operators works

我在下面尝试过,但没有用。抛出一些错误。 Exp1 或 expr2 应首先评估,结果应使用 expr3 ( &&)

评估
if [ "$val1" == "$val2" || "$val1" == "$val3" ]   && [ "$val4" > "$val5" ]
then
    echo "success"
elif [  "$val1" == "$val2" || "$val1" == "$val3" ]  && [ "$val4" < "$val5" ]
then
    echo "fail"
else
    echo "no result"
fi
fi

我按照建议尝试了,它抛出错误

 ./temp.ksh[11]: 03/20/1996: not found [No such file or directory]

Fyi- 该日期是 val1 值。

根据 shell 或版本,您可能会看到不同的结果,例如:sh vs bash vs ash。 一个例子是一些 bash 从 [ [(带有分隔符 space)产生错误,而 [[(没有分隔符 space)被接受。请注意 [ ] 与 [[ ]] 表达式中有不同的语义。

尝试从您的 || 中删除外部 space 分隔的 [ 和 ]表达。还要检查运算符优先级的文档以满足或确认您的需求。

另一个问题是重定向 < 和 > 的使用。检查当前目录中是否存在以 $val4 和 $val5 中的值命名的文件。切换到 -gt 和 -lt 进行比较。

同时为了避免意外:当使用 -gt 和 -lt 时,检查当操作数为空或非数字时会发生什么。

=======

5 月 24 日更新:

原文post没有指定shell;现在使用 ksh,运算符组合有问题。看起来您需要将 -o 和 -a 与 [ ] 表达式或 || 一起使用和 && 与 [[ ]] 表达式。切换到 [[ ]] 并替换 > 和 < 后,此版本适用于 jdoodle.com :

if [[ "$val1" == "$val2" || "$val1" == "$val3" ]] && [[ "$val4" -gt "$val5" ]]; then
    echo "success"
elif [[ "$val1" == "$val2" || "$val1" == "$val3" ]] && [[ "$val4" -lt "$val5" ]]; then
    echo "fail"
else
    echo "no result"
fi