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

Bash脚本中if条件为命令时的含义及cmp命令执行逻辑疑问

Bash中if条件与cmp命令的逻辑解析

你遇到的问题核心是对Bash里if的判断逻辑和cmp命令的退出状态码理解反了,具体拆解如下:

  1. Bash里if的判断规则
    当if后面跟的是命令时,它判断的是命令执行后的退出状态码:
  • 退出码为0:代表命令执行成功,if认为条件成立,会执行then区块的内容
  • 退出码为非0:代表命令执行失败(或不符合预期),if认为条件不成立,跳过then区块
  1. cmp命令的退出码定义
    cmp -s用来静默比较两个文件,它的退出码规则是:
  • 0:两个文件内容完全一致
  • 1:两个文件内容存在差异
  • 2:出现错误(比如文件找不到、权限不足等)

所以你的脚本里,当两个文件相同时,cmp返回0,if条件成立,就执行了continue;而文件不同时,cmp返回1,if条件不成立,就跳过了continue,这和你的预期完全相反。

如果要实现文件不同时执行continue的逻辑,有两种常见写法:

写法一:用!取反

file_path="/workspace/output.bin"
file_path_="/workspace/output_.bin"

if ! cmp -s "$file_path" "$file_path_"; then
    continue
fi

这里!会反转命令的退出码,文件不同时cmp返回1,取反后变成0,if条件成立,执行continue。

写法二:直接判断退出码

file_path="/workspace/output.bin"
file_path_="/workspace/output_.bin"

cmp -s "$file_path" "$file_path_"
# $?代表上一条命令的退出码
if [ $? -eq 1 ]; then
    continue
fi

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:02:05