Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash while循环从文本文件分解变量_Bash_Shell_While Loop - Fatal编程技术网

bash while循环从文本文件分解变量

bash while循环从文本文件分解变量,bash,shell,while-loop,Bash,Shell,While Loop,原文内容 $var1 $var4 $var3 $var2 testparher.sh的内容 #!/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" 我得到的file.

原文内容

$var1
$var4
$var3
$var2
testparher.sh的内容

#!/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"
我得到的file.txt是

$var1
$var4
$var3
$var2
那么,让循环将解析后的文本视为预加载变量的语法是什么呢


非常感谢您抽出时间。

您正在寻找
eval
,但它附带了很多警告

或者,您可能正在查找此处的文档

cat <<____HERE >file.txt
$var1
$var4
$var3
$var2
____HERE
cat您需要使用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"
#/bin/bash
var1=“史密斯^约翰”
var2=“998877”
var3=“成员”
var4=“12”
cat/dev/null>file.txt
filename=origlist
读行时;做
eval echo$line>>file.txt
完成<“$filename”

您可以通过使用“间接扩展”(有关说明,请参阅Bash手册页面)在不使用“eval”的情况下执行此操作:

在读取var | |[[$var]]时;做
varname=${var#$}
printf“%s\n”${!varname}
完成文件.txt
“[$var]]”是输入文件中允许未终止的最后一行所必需的

必须从变量名中删除“$”。它需要在输入文件中吗


如果变量值以“echo”选项开头,请使用“printf”而不是“echo”。

非常感谢!!!!我所要做的就是添加eval。我真不敢相信我哪儿都找不到这个。感谢您强烈建议不要在此处使用
eval
。可以将任意代码插入到
origlist
,此代码将愉快地执行它。+1这更安全,因为如果修改输入文件的内容,使用
eval
会带来巨大的安全风险。使用间接参数扩展,最糟糕的情况是意外输入将导致错误的替换;我认为
file.txt
在设置它引用的变量之前就存在了。
#!/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"
while read var || [[ $var ]] ; do
    varname=${var#$}
    printf '%s\n' "${!varname}"
done <"$filename" >file.txt