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

Groovy脚本中Shell字符串触发Unexpected EOF错误求助

Jenkins Groovy流水线Shell脚本Unexpected EOF错误解决

问题场景

在Jenkins Groovy流水线中编写了如下脚本:

environment {
    REPORT = "${params.REPORT}"
    DATE = sh(script: "echo `date +%F`", returnStdout: true).trim()
    REPORTNAME = "${params.REPORT}-$DATE-report.csv"
    EMAIL_RECIPIENTS = "my@email.com"
    EMAIL_RECIPIENTS_DEBUG = "my@email.com";
    EMAIL_PREFIX = "Serverless Cadence Report - ${params.REPORT}"
}

stages {
    stage('Lambda Report Execution') {
        when {
            expression{REPORT == "lambda"}
        }
        steps {
            container('aws-cli') {
                sh '''
                    cd cadence/serverless/${REPORT}/
                    rm -f results.out
                    touch results.out
                    echo """Region,AccountID,Resource,Runtime,LastModified""" > ${REPORTNAME}
                  #  aws configservice select-aggregate-resource-config --expression \"SELECT accountId, awsRegion, resourceId, resourceName, configuration.runtime, configuration.lastModified WHERE resourceType = 'AWS::Lambda::Function'\" --configuration-aggregator-name DelegatedAdminAggregator --profile my-profile --query \"Results\" --output text | tr '[:space:] '\n' > results.out 
                    while read line;do
                        echo $line | jq -r '. | [.awsRegion, .accountId, .resourceName, .configuration.runtime, .configuration.lastModified]|@csv' >> $REPORTNAME
                    done < results.out
               ''' 
            }
        }
    }
}

执行时触发如下错误:

10:29:36  + echo Region,AccountID,Resource,Runtime,LastModified
10:29:36  /home/jenkins/agent/workspace/serverless-cadence-reporter@tmp/durable-2327237a/script.sh: 
line 9: unexpected EOF while looking for matching `''

问题原因

错误并非来自表头的echo语句,而是注释掉的aws命令行中的tr命令存在单引号配对错误:
原代码中tr '[:space:] '\n'的写法里,第一个单引号包裹了[:space:] (包含空格),但后面的'\n'是另一个单引号开头,没有对应的闭合单引号。Shell解析脚本时会扫描整个行的语法(即使是注释行),导致它一直寻找匹配的单引号,直到脚本结束都找不到,最终触发Unexpected EOF错误。

解决方案

  1. 修复tr命令的单引号写法,改为正确的字符集和分隔符格式:
    将tr '[:space:] '\n'修改为tr '[:space:]' '\n',让两个单引号分别包裹空格字符集和换行符转义序列。
  2. 简化表头的echo语句,去掉不必要的三重双引号,直接用普通双引号即可。

修改后的Shell脚本部分如下:

cd cadence/serverless/${REPORT}/
rm -f results.out
touch results.out
echo "Region,AccountID,Resource,Runtime,LastModified" > ${REPORTNAME}
# aws configservice select-aggregate-resource-config --expression "SELECT accountId, awsRegion, resourceId, resourceName, configuration.runtime, configuration.lastModified WHERE resourceType = 'AWS::Lambda::Function'" --configuration-aggregator-name DelegatedAdminAggregator --profile my-profile --query "Results" --output text | tr '[:space:]' '\n' > results.out 
while read line;do
    echo $line | jq -r '. | [.awsRegion, .accountId, .resourceName, .configuration.runtime, .configuration.lastModified]|@csv' >> $REPORTNAME
done < results.out

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:44:54