You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多条件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

关键优化点

  1. 修正逻辑结构:用[[ ... && ... ]]将用户检查的两个条件绑定,确保必须同时满足「不是_mbsetupuser」且「不是root」
  2. 简化pgrep调用:添加-q参数让pgrep静默输出,只返回状态码,避免冗余打印
  3. 函数逻辑简化:直接利用命令的返回值,无需额外return语句,符合Shell脚本的简洁性原则

内容的提问来源于stack exchange,提问作者Albert Chan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 02:15:21