2014-10-28 87 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