【问题标题】:bash while loop to explode variables from text filebash while循环从文本文件中分解变量
【发布时间】:2014-10-28 17:53:36
【问题描述】:

原始列表的内容

$var1
$var4
$var3
$var2

testparser.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是:

Smith^John
12
member
998877

我得到的 file.txt 是

$var1
$var4
$var3
$var2

那么让循环将解析后的文本视为预加载变量的语法是什么?

非常感谢您的宝贵时间。

【问题讨论】:

    标签: bash shell while-loop


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • +1 这更安全,因为如果输入文件的内容被修改,使用eval 会带来巨大的安全风险。使用间接参数扩展,可能发生的最坏情况是意外输入会导致错误的替换错误。
    【解决方案2】:

    你需要使用 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"
    

    【讨论】:

    • 非常感谢!!!!我所要做的就是添加 eval。我不敢相信我在任何地方都找不到这个。谢谢
    • 这里强烈不鼓励使用eval。可以在origlist 中插入任意代码,这段代码会愉快地执行它。
    【解决方案3】:

    您正在寻找eval,但它带有很多警告。

    或者您可能正在寻找此处的文档。

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

    【讨论】:

    • 这里的文档没有帮助;我认为file.txt 存在于它引用的变量被设置之前。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 2014-03-02
    • 2012-01-24
    相关资源
    最近更新 更多