我在几个文本文件中引入了shell变量(例如VAR1或$VAR2)。
我想把这些文件(一个接一个)保存在所有变量都会被替换的新文件中。
为此,我使用了以下shell脚本(可在StackOverflow上找到):
while read line
do
eval echo "$line" >> destination.txt
done < "source.txt"
这在非常基本的文件上非常有效。
但是对于更复杂的文件,“eval”命令做得太多了:
>
跳过以“#”开头的行
XML文件解析会导致大量错误
有没有更好的方法?(在外壳脚本中...例如,我知道这很容易用蚂蚁完成)
亲切的问候
看起来,在我的系统上有一个envsubst
命令,它是gettext基本包的一部分。
因此,这使其变得容易:
envsubst < "source.txt" > "destination.txt"
注如果您想对两者使用同一个文件,您必须使用类似于moreutil的< code>sponge的东西,正如Johnny Utahh所建议的
关于答案2,在讨论envsubst时,您问:
我怎样才能让它与我的?sh剧本?
答案是,您只需要在调用envsubst
之前导出变量。
您还可以使用 envsubst
SHELL_FORMAT
参数限制要在输入中替换的变量字符串(避免意外地将输入中的字符串替换为公共 shell 变量值 - 例如 $HOME
)。
例如:
export VAR1='somevalue' VAR2='someothervalue'
MYVARS='$VAR1:$VAR2'
envsubst "$MYVARS" <source.txt >destination.txt
将source. txt
中的$VAR1
和$VAR2
的所有实例(并且仅VAR1
和VAR2
)分别替换为'Somvalue'
和'某物值'
。
我知道这个主题很旧,但我有一个更简单的工作解决方案,无需导出变量。可以是oneliner,但我更喜欢在行端使用\
进行拆分。
var1='myVar1'\
var2=2\
var3=${var1}\
envsubst '$var1,$var3' < "source.txt" > "destination.txt"
# ^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^^
# define which to replace input output
变量需要定义为与 envsubst
相同的行,才能被视为环境变量。
'$var1,$var3'
是可选的,只能替换指定的。假设一个输入文件包含不应被替换的${VARIABLE_USED_BY_JENKINS}
。