假设我有一个名为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文件读取变量或将一个字符串拆分成多个变量的页面。
答案 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代码。