让Bash解析文件输入中的变量

时间:2016-02-22 05:47:48

标签: bash shell

假设我有一个名为path.txt的文件,其中包含单行上的文字$HOME/filedump/。然后我怎样才能将path.txt的内容读入变量,同时让Bash解析所说的内容?

以下是我正在尝试做的一个例子:

#!/bin/bash
targetfile="path.txt"

target=$( [[ -f $targetfile ]] && echo $( < $targetfile ) || echo "Not set" )
echo $target

所需的输出:/home/joe/filedump/

实际输出:$HOME/filedump/

我尝试使用cat代替<,用引号括起来等等。似乎什么都没有把我带到任何地方。

我确定我错过了一些明显的东西,而且可能还有一个简单的内置命令。我在Google上找到的只是从ini / config文件读取变量或将一个字符串拆分成多个变量的页面。

3 个答案:

答案 0 :(得分:1)

如果您要评估path.txt的内容并将其分配给target,请使用:

target=$(eval echo $(<path.txt))

例如:

$ target=$(eval echo $(<path.txt)); echo "$target"
/home/david/filedump/

答案 1 :(得分:0)

这可能不一定适合您的需求(取决于您提供的代码的上下文),但以下内容对我有用:

targetfile="path.txt"
target=$(cat $targetfile)
echo $target

答案 2 :(得分:0)

这是比eval更安全的替代方案。通常,您不应该使用需要bash的配置文件来评估其内容;这只会在您的脚本中打开安全风险。相反,检测是否存在需要评估的内容,并明确处理它。例如,

IFS= read -r path < path.txt
if [[ $path =~ '$HOME' ]]; then
    target=$HOME/${path#\$HOME}
    # more generally, target=${path/\$HOME/$HOME}, but
    # when does $HOME ever appear in the *middle* of a path?
else
    target=$path
fi

这要求您提前知道path.txt中可能出现的变量,但这是事物。你不应该评估未知代码。

请注意,在这种情况下,您可以使用任何占位符代替变量;可以像%h/filedump一样轻松地检测和处理$HOME/filedump,而不必假设内容可以或应该被评估为shell代码。