Bash脚本while循环使用curl对比返回值报command not found错误
错误原因
Bash 中while关键字后默认会将后续内容作为可执行命令运行,判断命令退出码是否为0来决定是否进入循环。你直接裸写"$(curl ...)" == "Running"的比较表达式时,Shell会先执行curl命令拿到返回值(比如Running),随后尝试将这个返回值作为命令名执行,把==、"Running"作为传给该命令的参数,系统中不存在名为Running的命令,就会抛出Running: command not found的报错。
Bash 不支持直接裸写A == B形式的字符串比较,这类判断逻辑必须放在专用的测试结构中执行。
修正后可直接运行的脚本
优先推荐Bash原生双中括号写法,容错性更高:
while [[ "$(curl -sS --user tc-bot:"$TC_BOT_PASSWORD" -X GET "http://teamcity-server:8111/teamcity/app/rest/server/backup")" == "Running" ]] do echo "Backup is running" sleep 10 done
如果需要兼容POSIX标准Shell,可以使用单中括号的test语法:
while [ "$(curl -sS --user tc-bot:"$TC_BOT_PASSWORD" -X GET "http://teamcity-server:8111/teamcity/app/rest/server/backup")" = "Running" ] do echo "Backup is running" sleep 10 done
优化说明
- 给curl增加了
-sS参数:-s是静默模式,屏蔽默认的进度统计、请求冗余输出,避免干扰结果判断;-S配合静默模式使用,仅在请求出错时打印错误信息,方便排查问题 - 所有命令替换结果都用双引号包裹,避免返回值含特殊字符、空白时触发语法错误
- 单中括号是POSIX标准写法,字符串比较的标准操作符为单个
=;双中括号是Bash专属扩展语法,支持==作为比较操作符,写法更宽松 - 如果接口返回可能携带首尾换行、空格等不可见空白,可以在curl命令后拼接
| xargs自动去除首尾空白,比如将命令替换部分写为"$(curl -sS ... | xargs)",避免不可见字符导致判断逻辑失效
内容的提问来源于stack exchange,提问作者Stark
相关产品推荐
相关产品推荐

