多条件if语句实现咨询:多检查项Shell脚本写法是否最优
多条件Shell脚本检查的优化方案
你的需求是在执行后续操作前完成三项必过检查:
- SomeApp未运行
- 当前登录用户既不是
_mbsetupuser也不是root - Finder处于运行状态
只要有一项不满足,就输出something is wrong。原代码存在逻辑运算符优先级错误,导致条件判断不符合预期,同时函数可以进一步简化,以下是修正和优化后的方案:
原代码问题分析
原if语句中的||优先级低于&&,实际执行逻辑会被解析为:(appNotRunning && 用户不是_mbsetupuser) || (用户不是root && finderRunning)
这和你需要的「三个条件同时满足」完全不符,会出现大量误判情况。
优化后的代码
简化版(无需额外函数)
直接在if条件中完成判断,逻辑更直观:
# 若未获取登录用户,可添加这行 loggedInUser=$(whoami) if ! pgrep -q SomeApp \ && [[ "$loggedInUser" != "_mbsetupuser" && "$loggedInUser" != "root" ]] \ && pgrep -q Finder; then echo "everything pass" else echo "something is wrong" fi
保留函数的优化版
如果坚持用函数封装检查逻辑,可简化函数并修正条件结构:
appNotRunning() { ! pgrep -q SomeApp # pgrep找到进程返回0,取反后未运行返回0(判定成功) } finderRunning() { pgrep -q Finder # Finder运行则返回0(判定成功) } loggedInUser=$(whoami) if appNotRunning \ && [[ "$loggedInUser" != "_mbsetupuser" && "$loggedInUser" != "root" ]] \ && finderRunning; then echo "everything pass" else echo "something is wrong" fi
关键优化点
- 修正逻辑结构:用
[[ ... && ... ]]将用户检查的两个条件绑定,确保必须同时满足「不是_mbsetupuser」且「不是root」 - 简化pgrep调用:添加
-q参数让pgrep静默输出,只返回状态码,避免冗余打印 - 函数逻辑简化:直接利用命令的返回值,无需额外
return语句,符合Shell脚本的简洁性原则
内容的提问来源于stack exchange,提问作者Albert Chan
相关产品推荐
相关产品推荐

