如何在sh使用单引号场景下完成sed内部变量的参数化
问题根因
你使用三重单引号包裹shell脚本时,外层调用逻辑(如Jenkins Pipeline、Groovy调度脚本等)的字符串解析规则为:单引号包裹的内容默认不触发变量插值,只有双引号块会做外层变量预展开,这是切换为三重单引号后${UID}、${PWD}参数化失效的核心原因。
可行解决方案(均满足sh后仅使用单引号的要求)
方案1:通过位置参数传递变量
将需要参数化的变量作为sh命令的入参传递,shell内部通过位置变量接收:
sh '''#!/bin/bash INPUT_UID=$1 INPUT_PWD=$2 INPUT_WORKSPACE=$3 source /etc/profile.d/rvm.sh cat /proc/meminfo echo 'In credentails' sed -i "/:LOGINID:/ c\:LOGINID: ${INPUT_UID}" "${INPUT_WORKSPACE}/test/data/TEST.TXT" sed -i "/:LOGINPWD:/ c\:LOGINPWD: ${INPUT_PWD}" "${INPUT_WORKSPACE}/test/data/TEST.TXT" ''' "${UID}" "${PWD}" "${WORKSPACE}"
- 三重单引号块结束后按顺序传入需要参数化的外层变量,依次对应shell内的
$1、$2、$3 - sed指令部分使用双引号包裹,确保shell执行时可以正常展开内部变量
方案2:从环境变量读取
如果需要参数化的变量已经被外层导出为环境变量,直接修改sed指令的引号包裹方式即可:
sh '''#!/bin/bash source /etc/profile.d/rvm.sh cat /proc/meminfo echo 'In credentails' # sed指令改用双引号包裹,触发shell层面的变量展开 sed -i "/:LOGINID:/ c\:LOGINID: ${UID}" "${WORKSPACE}/test/data/TEST.TXT" sed -i "/:LOGINPWD:/ c\:LOGINPWD: ${PWD}" "${WORKSPACE}/test/data/TEST.TXT" '''
- 该方案仅适用于
${UID}、${PWD}、${WORKSPACE}已经作为环境变量的场景,sed指令用双引号包裹即可让当前执行的shell完成变量展开。
内容的提问来源于stack exchange,提问作者tes8989
相关产品推荐
相关产品推荐

