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
相关产品推荐
相关产品推荐

