2

每当我尝试使用一个变量来构建另一个变量时,我都会得到意想不到的结果。我已经缩小了一点范围,但可以对这里发生的事情提供一些帮助。我的本地脚本执行此操作:

CUR_TIME=$(date "+%Y%m%d_%HH%MM%SS")
CUR_TIME="build_"$CUR_TIME

这给了我想要的结果。但是,每当我尝试使用它来构建另一个变量或回显包含此变量的内容时:

echo "/home/path/blah/$CUR_TIME"

我的结果只回显了$CUR_TIME变量。这里发生了什么?

$CUR_TIME变量是在我的本地 shell 会话中设置的,我通过 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

编辑

经过进一步的故障排除后,如果我将我的任何变量 from包含$additional_vars到路径名并将其放在我指定的任何内容之前,它会导致路径的该部分为空。所以这不仅仅是$CUR_TIME变量。奇怪的是,回显 an$additional_var本身就很好。

我的 .properties 文件如下所示:

var1="something"
var2="something2"
var3="something3"
var3="ftp://something/another/$something_else"
var4="something.something"

如果我eval $additional_vars使用 进行测试printf ${additional_vars} | hexdump -C,我的输出会产生一个十六进制值,然后|var1="something".|

4

1 回答 1

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
于 2013-06-10T15:46:20.303 回答