每当我尝试使用一个变量来构建另一个变量时,我会得到意想不到的结果。我把它缩小了一点但是可以对这里发生的事情稍加帮助。我的本地脚本执行此操作:
CUR_TIME=$(date "+%Y%m%d_%HH%MM%SS")
CUR_TIME="build_"$CUR_TIME
这给了我想要的结果。但是,每当我尝试使用它来构建另一个变量或回显包含这个变量的东西时:
echo "/home/path/blah/$CUR_TIME"
我的结果只回显$CUR_TIME
变量。这里发生了什么?
我的本地shell会话设置了$CUR_TIME
变量,我通过ssh从远程服务器获取其他变量,如additional_vars=$(ssh user@server "cat variables.properties")
eval $addtional_vars
。 $additional_vars
包含相当多的变量,并且单独回显它们可以正常工作。
然后,我使用以下格式构建或回显新变量:
echo "/home/path/blah/$additional_var1/"
这回应得恰到好处,但如果我这样做(反向):
echo "/$additional_var1/home/path/blah"
我的结果只是/home/path/blah
。
修改
经过进一步的故障排除后,看起来如果我将{{1>}的{em>任何我的vars包含在路径名中,并将其放在我指定的任何内容之前,它会导致该部分路径被空值。所以它不仅仅是$additional_vars
变量。奇怪的是,回复$CUR_TIME
本身就很好。
我的.properties文件如下所示:
$additional_var
如果我使用var1="something"
var2="something2"
var3="something3"
var3="ftp://something/another/$something_else"
var4="something.something"
测试eval $additional_vars
,我的输出结果为十六进制值,然后是printf ${additional_vars} | hexdump -C
答案 0 :(得分:1)
我做的第一件事是:
additional_vars=$(ssh user@server "cat variables.properties")
如果我然后回显了这个变量,它会显示一个包含这些信息的多行变量:
var1="something"
var2="something2"
var3="something3"
var3="ftp://something/another/$something_else"
var4="something.something"
因此,当我运行eval $additional_vars
时出现了一些奇怪的事情,这似乎是逐行进行并分配variables.properties
中分配的变量,因为如果我然后回显变量那就没事了。但是使用它们给出了我在帖子中提到的有趣结果。
我最终这样做是为了让它发挥作用:
additional_vars=$(ssh user@server "cat variables.properties")
printf %s "$additional_vars" | while IFS= read -r line
do
eval $line
done
这解决了每一个问题,但我不确定为什么这会在其他方面起作用。
或者,也可以执行以下操作:
for line in $additional_vars
do
eval $line
done