如何在GitLab CI中用awk处理$GITLAB_USER_NAME提取用户名字
错误原因
原有写法的问题在于$($GITLAB_USER_NAME | awk '{ print $2 }')的语法不符合shell执行逻辑:$()包裹的内容会被shell识别为命令执行,直接传入变量值相当于尝试把Jones, Indiana这类用户名当作系统命令运行,自然无法得到预期结果,还会触发命令不存在的报错。
另外awk默认以任意空白字符为分隔符,即使修正了执行逻辑,直接print $2也可能在名字包含空格的场景下取值异常,需要显式指定分隔符为, (逗号加空格)匹配用户名的存储格式。
正确修正方案
方案1:通过管道传递变量(写法简单易读)
把变量通过echo输出后再通过管道传递给awk处理,显式指定分隔符即可正确提取名字:
deploy_to_server: stage: deploy when: manual script: - touch report.txt - printf "Hello $(echo "$GITLAB_USER_NAME" | awk -F ', ' '{ print $2 }').\n" >> report.txt - cat report.txt
方案2:通过awk参数传递变量(性能更优,无需启动子进程管道)
直接通过awk的-v参数把shell变量传入awk内部处理,避免管道开销:
deploy_to_server: stage: deploy when: manual script: - touch report.txt - printf "Hello $(awk -v user="$GITLAB_USER_NAME" 'BEGIN{split(user, parts, /, /); print parts[2]}').\n" >> report.txt - cat report.txt
方案3:使用shell内置参数扩展(无需调用awk,性能最优)
如果CI运行环境是bash类shell,可以直接用shell内置的字符串截取功能,不需要调用外部awk命令:
deploy_to_server: stage: deploy when: manual script: - touch report.txt - printf "Hello ${GITLAB_USER_NAME#*, }.\n" >> report.txt - cat report.txt
#*, 的含义是删除变量值从开头到第一个, 的内容,剩下的就是名字部分,性能比调用外部命令好很多。
以上三种方案都可以稳定输出Hello Indiana格式的预期结果。
内容的提问来源于stack exchange,提问作者AbreQueVoy
相关产品推荐
相关产品推荐

