1.问题场景
Jenkins使用sh步骤执行awk进行md5值生成,代码为:
sh """
find "${workspaceDir}" -type f -print0 | xargs -0 -I {} bash -c 'filename=$(basename "{}"); md5sum "{}" | awk "{print \\$1 \\" \\" substr(\\$0, index(\\$0, \\"${filedir}/\\") + length(\\"${filedir}/\\")) \\" \\" >> \\"${outputFilePath}\\"}"'
"""
Jenkins提示报错:
illegal string body character after dollar sign;solution:either escape aliteral dollar sign
"$5"or bracket the value expression "$f5}"
2.解决思路
2.1检查shell命令转译
- Groovy会将$1作为变量,所以再
awk
命令中使用 \\ 将 $1 转义为 \\$1 - 使用
sed
来提取相对路径时,使用了|
代替/
作为分隔符,以避免在路径中包含/
时出现错误 - 使用"\\”来转义每一个双引号
以上规则可以确保命令的正确性,但不是这个报错的根本解决办法,但是如果使用解决方案无法解决的时候可以参考以上规则
2.2解决方案
- 单引号
'
:单引号内的内容会原样输出,不会解释转义字符。 - 双引号
"
:双引号内的内容会解释转义字符,并且会插入 Groovy 变量的值。
将双引号(sh """ """)更改为单引号(sh''' ''')
sh '''
find "${workspaceDir}" -type f -print0 | xargs -0 -I {} bash -c 'filename=$(basename "{}"); md5sum "{}" | awk "{print \\$1 \\" \\" filename \\" \\" substr(\\$0, index(\\$0, \\"${workspaceDir}/\\") + length(\\"${workspaceDir}/\\"))\\" >> \\"${bootloader_outputFilePath}\\"}"'
'''
解决方案很简单,但是查了好久才查到,希望能帮到遇到同样问题的你。