首页 > 解决方案 > 逻辑运算符的工作原理

问题描述

我在下面尝试过,但它不起作用。抛出一些错误。exp1 或 expr2 应该首先评估 & at 结果应该用 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]

仅供参考-该日期是 val1 值。

标签: linuxshellif-statementunixlogical-operators

解决方案


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

尝试从您的 || 中删除外部空格分隔的 [ 和 ] 表达。还要检查文档以了解操作员优先级以满足或确认您的需求。

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

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

=======

5月24日更新:

原始帖子没有指定外壳;现在使用 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

推荐阅读