Jenkins中运行含AWS CLI命令的脚本时IF条件报错如何解决?
问题根源
- 你使用的
(( ))是Bash专属的算术运算语法,仅支持整数类的比较和运算,完全不支持字符串比较。字符串放入(( ))中会被Shell直接识别为命令尝试执行,这就是报错信息里InProgress: not found的原因:Shell把你拿到的实例刷新状态值当成了命令执行。 - 之前尝试
[]仍然报错,大概率是没有遵守POSIX语法的空格要求,或是用了仅Bash支持的双等于号:Jenkins默认调用/bin/sh执行脚本,不支持Bash的扩展语法,必须遵守标准POSIX规则。
解决方案
方案1:兼容所有Shell环境(Jenkins场景推荐)
直接替换if条件为以下符合POSIX标准的写法,适配sh、bash所有环境:
if [ "$instance_refresh_status" = "Successful" ]; then break fi
必须严格遵守的语法规则:
[和变量之间、变量和=之间、=和对比字符串之间、字符串和]之间必须留有空格,缺少空格会直接触发语法错误- 变量必须用双引号包裹,避免AWS返回值为空时触发语法异常
- 字符串比较用单等号
=即可
方案2:显式指定Bash运行脚本
如果要使用Bash的扩展特性,首先在脚本第一行添加#!/bin/bash声明,或是在Jenkins的Shell执行配置中指定用bash运行脚本,之后if条件可以写为:
if [[ "$instance_refresh_status" == "Successful" ]]; then break fi
[[ ]]是Bash专属的扩展语法,支持双等于号做字符串比较,也无需担心变量空值的语法问题,但是仅能在Bash环境下运行。
额外优化建议
当前逻辑是死循环,如果实例刷新触发失败(状态变为Failed/Cancelled)任务会一直卡住,建议补充异常状态判断:
while true; do instance_refresh_status=$(aws autoscaling describe-instance-refreshes --auto-scaling-group-name test-asg --query "InstanceRefreshes[0].Status" --output text --region us-east-1) if [ "$instance_refresh_status" = "Successful" ]; then echo "实例刷新完成" break fi # 新增失败状态判断 if [ "$instance_refresh_status" = "Failed" ] || [ "$instance_refresh_status" = "Cancelled" ]; then echo "实例刷新异常,当前状态:$instance_refresh_status" exit 1 fi sleep 10 done
内容的提问来源于stack exchange,提问作者YYashwanth
相关产品推荐
相关产品推荐

