Linux Bash脚本变量解释

Linux Bash脚本变量解释,linux,bash,shell,unix,Linux,Bash,Shell,Unix,我有一个文本文件,其中包含对变量的引用,允许用户设置他们想要的变量格式,比如 The date is $DATE The time is $TIME 然后我想读入这个文本文件,替换变量,并使用bash脚本将结果打印到stdout。我得到的最接近的东西是使用“echo”来输出它 DATE="1/1/2010" TIME="12:00" TMP=`cat file.txt` echo $TMP 但是,输出结果都在一行上,我不希望在文本文件的每一行末尾都有\n。我尝试使用“cat您可以

我有一个文本文件,其中包含对变量的引用,允许用户设置他们想要的变量格式,比如

 The date is $DATE
 The time is $TIME
然后我想读入这个文本文件,替换变量,并使用bash脚本将结果打印到stdout。我得到的最接近的东西是使用“echo”来输出它

 DATE="1/1/2010"
 TIME="12:00"
 TMP=`cat file.txt`
 echo $TMP

但是,输出结果都在一行上,我不希望在文本文件的每一行末尾都有\n。我尝试使用“cat您可以使用
eval
来确保变量在数据文件中展开:

DATE="1/1/2010"
TIME="12:00"
while read line
do
  eval echo ${line}
done < file.txt
DATE=“2010年1月1日”
TIME=“12:00”
读行时
做
eval echo${line}
完成
注意,这允许控制文件内容的用户执行任意命令

如果输入文件不在您的控制范围内,则更安全的解决方案是:

DATE="1/1/2010"
TIME="12:00"
sed -e "s#\$DATE#$DATE#" -e "s#\$TIME#$TIME#" < file.txt
DATE=“2010年1月1日”
TIME=“12:00”
sed-e“s#\$DATE#$DATE#”-e“s#\$TIME#$TIME#”

它假定
$DATE
$TIME
都不包含
#
字符,并且不应展开其他变量。

比Adam的响应稍微紧凑一些:

DATE="1/1/2010"
TIME="12:00"
TMP=`cat file.txt`
eval echo \""$TMP"\"

所有这些的缺点是最终会挤压引号。更好的方法是使用真正的模板。我不知道如何在shell中实现这一点,所以如果可能的话,我会使用另一种语言。模板的优点是可以消除“任意命令”“Adam提到的洞,没有编写像sed一样难看的代码。

只需引用变量以保留换行符

DATE="1/1/2010"
TIME="12:00"
TMP=$(cat file.txt)
echo "$TMP"

对于使用变量修改文件中的值,可以执行以下操作-

while read -r line
do 
   sed -e "s@\$DATE@$DATE@" -e "s@\$TIME@$TIME@" <<< "$line"
done < file.txt
读取时-r行
做
sed-e“s\$DATE@$DATE@”-e“s\$TIME@$TIME@”
[jaypal:~/Temp] cat file.txt
The date is $DATE
The time is $TIME
[jaypal:~/Temp] DATE="1/1/2010"
[jaypal:~/Temp] TIME="12:00"
[jaypal:~/Temp] while read -r line; do sed -e "s@\$DATE@$DATE@" -e "s@\$TIME@$TIME@" <<< "$line"; done < file.txt
The date is 1/1/2010
The time is 12:00