2014-10-28 48 views
1

内容origlist的testparsher.sh庆典while循环爆炸从文本文件中的变量

#!/bin/bash 

var1="Smith^John" 
var2="998877" 
var3="member" 
var4="12" 
cat /dev/null > file.txt 

filename=origlist 

while read line; do 

    echo $line >> file.txt 

done < "$filename" 

$var1 
$var4 
$var3 
$var2 

内容我想file.txt的是:

Smith^John 
12 
member 
998877 

的file.txt我得到的是

$var1 
$var4 
$var3 
$var2 

那么,让循环将解析的文本看作预加载变量的语法是什么?

非常感谢你的时间。

回答

0

你需要使用eval:

#!/bin/bash 

var1="Smith^John" 
var2="998877" 
var3="member" 
var4="12" 
cat /dev/null > file.txt 

filename=origlist 

while read line; do 
    eval echo $line >> file.txt 
done < "$filename" 
+0

非常感谢你!我所要做的只是添加eval。我无法相信我无法在任何地方找到它。谢谢 – mAsTeRoFnOne 2014-10-28 06:18:09

+1

这里'eval'的使用*强烈*不鼓励。任意代码可以插入到'origlist'中,并且这个代码会很高兴地执行它。 – chepner 2014-10-28 12:02:00

0

您正在寻找eval,但它有很多注意事项。

或者您也许正在寻找这里的文档。

cat <<____HERE >file.txt 
$var1 
$var4 
$var3 
$var2 
____HERE 
+0

这里的文件不会帮助;我认为'file.txt'在其引用的变量被设置之前存在。 – chepner 2014-10-28 12:03:03

2

您可以通过使用 “间接扩张”(见解释Bash的手册页)这样做没有 'EVAL':

while read var || [[ $var ]] ; do 
    varname=${var#$} 
    printf '%s\n' "${!varname}" 
done <"$filename" >file.txt 

'[[$ var]]'是允许输入文件中未终止的最后一行所必需的。

'$'必须从变量名称中删除。它是否需要在输入文件中?

如果变量值以'echo'选项开头,则使用'printf'而不是'echo'。

+1

+1这样更安全,因为如果输入文件的内容被修改,使用'eval'会带来巨大的安全风险。使用间接参数扩展,可能发生的最坏情况是意外输入会导致错误的替换错误。 – chepner 2014-10-28 12:01:01