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

Bash中if [[ condition ]]与if condition的差异及脚本故障排查

Bash中if condition与if [[ condition ]]的核心区别及脚本问题解析

一、两者的本质差异

  • if condition:基于命令退出码判断
    这里的condition是一条可执行命令(或命令组合),Bash会运行该命令,根据命令的退出状态码决定分支走向:

    • 退出码为0(命令执行成功),进入then分支
    • 退出码非0(命令执行失败),进入else分支
      比如第一个脚本里的pgrep -x $process_name < /dev/null,就是通过pgrep命令的退出码判断进程是否存在:找到进程时pgrep返回0,否则返回非0。
  • if [[ condition ]]:基于Bash内置条件表达式判断
    这里的condition是Bash专属的条件表达式语法,仅用于字符串匹配、文件属性测试、数值比较等逻辑判断,不会执行外部命令。常见用法示例:

    [[ $str == "hello" ]]   # 字符串相等判断
    [[ -f /etc/passwd ]]    # 判断文件是否为普通文件且存在
    [[ $num -gt 10 ]]       # 数值大于比较
    

    在[[ ]]内部,除了表达式关键字(如-f、-gt),其他内容都会被当作字符串解析,而非可执行命令。

二、第二个脚本的问题根源

你在第二个脚本中写的[[ pgrep -x $process_name < /dev/null ]]犯了本质逻辑错误:

  • [[ ]]中pgrep不会被当作外部命令执行,而是被视为普通字符串;
  • 这里的<不是重定向符号,而是Bash条件表达式中的字符串小于运算符(按ASCII码值比较);
  • 整个表达式会被解析为:将字符串pgrep -x $process_name与字符串/dev/null做ASCII码大小比较,完全偏离了你“执行pgrep判断进程状态”的需求,因此无法正确运行。

若想用[[ ]]实现需求的正确写法

要在[[ ]]中判断命令执行结果,需通过命令替换或直接判断退出码,示例:

if [[ $(pgrep -x "$process_name" > /dev/null 2>&1; echo $?) -eq 0 ]]
then
    echo "Process is running"
else
    echo "Process is not running"
fi

不过更简洁的方式是直接用命令判断(没必要硬套[[ ]]):

if pgrep -x "$process_name" > /dev/null 2>&1
then
    echo "Process is running"
else
    echo "Process is not running"
fi

(注:给$process_name加双引号是为了兼容进程名含空格的场景)

内容的提问来源于stack exchange,提问作者Nikita Rawool

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:05:13