bash multiple heredocs et al

时间:2015-02-24 23:02:29

标签: bash shell sh heredoc

我有一个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)

我的后备计划是创建临时文件,但我希望有一个我不知道的技巧,有人可以教我: - )

2 个答案:

答案 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