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