Shell Jenkins作业从带变量的文件中读取文本

时间:2018-07-02 08:26:59

标签: bash shell file jenkins

我正在bash shell脚本中实现Jenkins作业。 Jenkins作业正在使用变量Centralized-workflow,该变量可用作用户的输入。

在执行此jenkins作业期间,我在区域中也有一些文件,这些文件带有我grep的文字。

因此用户将启动作业,给定参数为: AS_OF_DATE

然后在工作期间,我从AS_OF_DATE: "20180331"文件中提取了一些文本。

test.txt

当我执行TEXT_FROM_FILE="This is my text, where i used ${AS_OF_DATE}" 的回显时,变量$TEXT_FROM_FILE不会随着用户添加的日期而改变。

我的结果是:

$AS_OF_DATE

应该是什么:

"This is my text, where i used ${AS_OF_DATE}"

我假设我没有在文件内正确声明变量,所以我的问题是在文件中正确指定将实际使用变量具有的值而不只是输出文本的变量。

先谢谢您。

1 个答案:

答案 0 :(得分:1)

与在文件中声明变量的方式无关。在文本字符串中具有变量名不会将该名称扩展为其值,除非您对其执行扩展操作。例如,如果文件包含可执行的source命令,则可以bash,但是仅将它们读取为文本将无济于事。

有两种解决方案。其中涉及使用eval,我不建议这样做,因为可以注入另一个命令(例如rm *),而eval将执行它。此外,如果我建议的话,我(很正确)会像疯了似的被否决。

更安全的做法是进行简单替换:

AS_OF_DATE="20180331"

# I use single quotes to prevent expansion here
TEXT_FROM_FILE='This is my text, where i used ${AS_OF_DATE}'

final_text=${TEXT_FROM_FILE/'${AS_OF_DATE}'/$AS_OF_DATE}
echo "$final_text"

礼物:

This is my text, where i used 20180331

如果您执行此替换操作,并且变量名不在文本中,那么它将仅复制现有字符串。