Groovy脚本执行AWS Shell命令报错求助:美元符号语法问题
Groovy脚本Shell命令报错修复
错误原因
Groovy会解析双引号包裹的字符串中$开头的内容,将其视为自身的变量表达式。你命令里的$(date -d +10days)是Shell的命令替换语法,被Groovy误判为自身语法,从而触发报错。
修复后的命令
sh "aws ec2 describe-images --filters Name=name,Values=${params.KUBE_AMI_NAME} | jq -r '.Images[].ImageId' | xargs -I {} aws ec2 enable-image-deprecation --image-id '{}' --deprecate-at \$(date -d +10days)"
关键修改点
- 转义Shell命令替换的
$:把$(date...)改成\$(date...),让Groovy不解析该部分,直接传递给Shell执行命令替换 - 修正xargs参数:移除
-0(jq输出为每行一个ImageId,-0按null分隔不适用),并将-I aws改为-I {}(-I后需指定占位符,原写法错误) - 调整占位符引号:将
--image-id "{}"改为--image-id '{}',避免Groovy解析双引号,同时保证Shell正确识别占位符
另一种写法(三重单引号字符串)
如果不想处理转义,可使用Groovy三重单引号包裹Shell命令,拼接Groovy变量:
sh '''aws ec2 describe-images --filters Name=name,Values=''' + "${params.KUBE_AMI_NAME}" + ''' | jq -r '.Images[].ImageId' | xargs -I {} aws ec2 enable-image-deprecation --image-id '{}' --deprecate-at $(date -d +10days)'''
内容的提问来源于stack exchange,提问作者Satyam Pandey
相关产品推荐
相关产品推荐

