旧版Jenkins流水线中如何用Python解析JSON并解决引号转义和变量赋值问题
报错原因
- 引号嵌套冲突:外层使用单引号包裹sh执行的命令内容,内部
os.environ['REPOSITORY']处的单引号会被Shell识别为外层单引号的闭合标记,导致命令提前截断,触发匹配失败的EOF报错。 - 隐藏语法问题:原命令中
echo metadataJson输出的是固定字符串metadataJson,而非你存储JSON数据的变量值,即使引号问题解决也无法得到正确解析结果。
正确执行语句
你可以使用以下两种不易出错的写法:
- 外层用双引号包裹sh命令,内部双引号用反斜杠转义:
sh "echo \"${metadataJson}\" | python -c 'import sys,os,json; print(json.load(sys.stdin)[os.environ[\"REPOSITORY\"]])'"
- 外层保留单引号,内部单引号使用
'\''做Shell转义:
sh 'echo "${metadataJson}" | python -c "import sys,os,json; print(json.load(sys.stdin)[os.environ'\''REPOSITORY'\''])"'
将输出存入Jenkins变量
使用sh步骤的returnStdout: true参数即可捕获命令输出,配合trim()方法去掉末尾自动生成的换行符:
def parsedResult = sh( script: "echo \"${metadataJson}\" | python -c 'import sys,os,json; print(json.load(sys.stdin)[os.environ[\"REPOSITORY\"]])'", returnStdout: true ).trim()
额外注意事项
如果你的JSON内容包含换行、双引号等特殊字符,直接用echo传递可能会导致JSON格式损坏,建议先写入临时文件再解析:
// 写入临时文件避免特殊字符转义问题 writeFile file: 'metadata.json', text: metadataJson def parsedResult = sh( script: 'python -c "import sys,os,json; print(json.load(open(\'metadata.json\'))[os.environ[\'REPOSITORY\']])"', returnStdout: true ).trim()
内容的提问来源于stack exchange,提问作者user124
相关产品推荐
相关产品推荐

