我有一个bash构建脚本,我(嗯,詹金斯,但这是无关紧要的,这是一个bash问题)执行如下:
sudo -u buildmaster bash <<'END'
# do all sorts of crazy stuff here including using variables, like:
ARGS=something
ARGS="$ARGS or other"
# and so forth
END
现在我想传入一个变量(Jenkins参数化构建),比如说PLATFORM。麻烦的是,如果我在我的heredoc中引用$ PLATFORM,它是未定义的(我使用'END'来避免变量替换)。如果我将'END'变为END,我的脚本变得非常难以理解我需要使用的所有转义。
所以问题是,是否有一些(简单,可读)的方式传入两个heredocs,一个带引号,一个没有,进入同一个bash调用?我在寻找像这样的东西
sudo -u buildmaster bash <<PREFIX <<'END'
PLATFORM=$PLATFORM
PREFIX
# previous heredoc goes here
END
希望它能简单地连接,但是我无法让两个heredoc工作(我猜bash不是Perl)
我的后备计划是创建临时文件,但我希望有一个我不知道的技巧,有人可以教我: - )
答案 0 :(得分:3)
在这种情况下,您可以考虑将bash
与-s
参数一起使用:
sudo -u buildmaster bash -s -- "$PARAMETER" <<'END'
# do all sorts of crazy stuff here including using variables, like:
ARGS=something
ARGS="$ARGS or other"
# and so forth
PARAMETER=$1
END
(请注意,您有语法错误,您的结束END
被引用且不应该被引用。
还有另一种可能性(这样你有很多选择 - 如果它适用,这个可能是最简单的选项)是导出你的变量,并使用-E
切换到{{ 1}}导出环境,例如,
sudo
除此之外,如果您不想导出所有内容,可以按以下方式使用export PARAMETER
sudo -E -u buildmaster bash <<'EOF'
# do all sorts of crazy stuff here including using variables, like:
ARGS=something
ARGS="$ARGS or other"
# and so forth
# you can use PARAMETER here, it's fine!
EOF
:
env
答案 1 :(得分:2)
将您引用的前缀替换为未加引号的完整文档:
# store the quoted part in a variable
prefix=$(cat <<'END'
ARGS=something
ARGS="$ARGS or other"
END
)
# use that variable in building the full document
sudo -u buildmaster bash <<END
$prefix
...
END