【问题标题】:read each line in a file, subsitute variables and send output to file bash读取文件中的每一行,替换变量并将输出发送到文件 bash
【发布时间】:2013-03-26 02:58:10
【问题描述】:

我有一个包含某些变量的文件。我想阅读每一行,替换变量并回显输出。我想阅读的源文件是这样的:

VAR1 is $A
VAR2 is $B
VAR3 is $C

我尝试了下面的脚本,但输出是一样的。

#/bin/sh
A=1
B=2
C=3

cat $file | while read LINE
do
 echo $LINE
done

如何让它替换变量来获得这个输出?

VAR1 is 1
VAR2 is 2
VAR3 is 3

提前致谢!

【问题讨论】:

    标签: bash variables loops while-loop cat


    【解决方案1】:

    代替

    echo $LINE
    

    放:

    eval echo $LINE
    

    【讨论】:

      【解决方案2】:

      eval 将执行任何有效的 shell 代码,因此存在一定的安全风险。这是一个更专注的解决方案,进行参数扩展,没有任意代码执行的风险。

      #/bin/sh
      A=1
      B=2
      C=3
      
      # Break each line into the variable name, "is", and the value. Then
      # strip the leading dollar sign from the value to keep just the
      # parameter name. Finally, use indirect parameter expansion to print
      # the value.
      while read name _ value
      do
       value=${value#$}
       echo "$name is ${!value}"
      done < "$file"
      

      【讨论】:

      • 这确实很高兴知道!虽然我要阅读的文件不包含任何 shell 代码,但我很想尝试一下。问题是,线条将具有不同的长度,因此每个变量的位置沿线。有什么建议?谢谢!
      • 嗯,这更棘手。您必须逐字逐句查找以$ 开头的单词(假设您没有类似foo${bar}baz 的单词),并在必要时在回显之前进行替换。我不常说这个,但只要你知道风险就使用eval
      【解决方案3】:

      由于 eval 存在安全风险, 为什么不试试呢:-

      cat $file | while read LINE
      do
         echo $LINE | sed -e "s/\$A/$A/g" -e "s/\$B/$B/g" -e "s/\$C/$C/g"
      done
      

      或者简单地说:-

      sed -e "s/\$A/$A/g" -e "s/\$B/$B/g" -e "s/\$C/$C/g" $file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-17
        • 2013-04-12
        • 2014-03-02
        • 1970-01-01
        • 1970-01-01
        • 2016-11-20
        • 1970-01-01
        相关资源
        最近更新 更多