linux - 逻辑运算符的工作原理
问题描述
我在下面尝试过,但它不起作用。抛出一些错误。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 值。
解决方案
您可能会看到基于 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
推荐阅读
- go - 如何动态决定执行任务的 goroutine 数量
- docker - 如何使用 docker .gitlab-ci.yml 文件传递 common/config/main-local.php 用户名、host.password?
- r - 当变量的顺序改变时,因果图发生变化
- azure - 如何跨多个订阅从 Azure 导出 VMData
- r - 在循环中定义动态变量并组合内容
- c# - NLog 在数据库中旋转和清理日志文件
- angular - 如何在 Ionic 4 cordova 上制作退出按钮
- python - 如何在python中通过互联网连接服务器和客户端
- python - 如何使用 Pyspark 将 RDD 转换为 Dataframe?
- amazon-web-services - 将调试消息保存到变量列表中