【问题标题】:Bash: how to process variables from an input file?Bash:如何处理输入文件中的变量?
【发布时间】:2010-03-20 18:52:32
【问题描述】:

我有一个 bash 脚本,可以从这样的文件中读取输入:

while IFS="|" read -r a b
do
   echo "$a something $b somethingelse" 
done < "$FILE"

它读取的文件如下所示:

http://someurl1.com|label1
http://someurl2.com|label2

但是,我希望能够在适合我的情况下将变量的名称插入到该文件中,并让脚本在看到它们时对其进行处理,因此文件可能如下所示:

http://someurl1.com?$VAR|label1
http://someurl2.com|label2

所以$VAR 可以是例如今天的日期,产生如下输出:

http://someurl1.com something label1 somethingelse
http://someurl2.com?20100320 something label2 somethingelse

【问题讨论】:

  • 但是该输入不会在 label1 之前而不是在 label2 之前生成日期吗?
  • 是的,但没关系。我想为某些行添加一个变量,而不是全部。

标签: bash file variables file-manipulation


【解决方案1】:

您可能会发现this page 很有用。对于您给出的示例,请尝试:

while IFS="|" read -r a b
do
    repl=`date +%Y%m%d`
    a=${a/\$VAR/$repl}
    echo "$a something $b somethingelse" 
done < "$FILE"

...虽然如果您使用的文件格式或语言不是一成不变的,可能会有更好的选择;)

【讨论】:

    【解决方案2】:

    你在寻找这样的东西吗?

    FILE=vexp.in
    VAR=20100320
    while IFS="|" read -r a b
    do
       eval echo "$a something $b somethingelse"
    done < "$FILE"
    

    【讨论】:

    • 出于安全原因,应避免使用 eval,这是一个特别好的示例。 miorel 的 回答显示了一种缩小范围以仅处理预期输入的方法。
    • 出于安全原因也应避免使用 Shell 脚本,但我们一直都在使用它们。并非每个问题都涉及代码注入漏洞,而且 miorel 的答案虽然合理,但确实存在仅扩展一个特定变量的缺点,并且仍然容易受到通用 shell 漏洞的攻击,因此仍不应在安全上下文中使用。
    【解决方案3】:

    对于将替换任何环境变量(以及执行任何代码,因此如果您不控制变量或清理输入,请不要使用它)的通用解决方案,请使用 eval:

    while IFS="|" read -r a b
    do
      eval a=$a
      eval b=$b
      echo "$a something $b somethingelse" 
    done < "$FILE"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多