【问题标题】:Bash script variable interpretationBash脚本变量解释
【发布时间】:2012-01-25 23:24:58
【问题描述】:

我有一个文本文件,其中包含对变量的引用,并允许用户围绕变量设置他们想要的格式,比如

 The date is $DATE
 The time is $TIME

然后我想读入这个文本文件,替换变量,并使用 bash 脚本将结果打印到标准输出。我得到的最接近的东西是使用“echo”来输出它,

 DATE="1/1/2010"
 TIME="12:00"
 TMP=`cat file.txt`
 echo $TMP

但是,输出最终都在一行上,我不想在文本文件的每一行末尾都有 \n。我尝试使用“cat

【问题讨论】:

    标签: linux bash shell unix


    【解决方案1】:

    您可以使用eval 来确保变量在您的数据文件中展开:

    DATE="1/1/2010"
    TIME="12:00"
    while read line
    do
      eval echo ${line}
    done < file.txt
    

    请注意,这允许控制文件内容的用户执行任意命令。

    如果输入文件不在您的控制范围内,更安全的解决方案是:

    DATE="1/1/2010"
    TIME="12:00"
    sed -e "s#\$DATE#$DATE#" -e "s#\$TIME#$TIME#" < file.txt
    

    它假定$DATE$TIME 都不包含# 字符,并且不应扩展其他变量。

    【讨论】:

      【解决方案2】:

      比亚当的回答稍微紧凑:

      DATE="1/1/2010"
      TIME="12:00"
      TMP=`cat file.txt`
      eval echo \""$TMP"\"
      

      所有这些的缺点是您最终会挤压引号。更好的是使用真实的模板。我不确定如何在 shell 中做到这一点,所以如果可能的话,我会使用另一种语言。模板化的好处是您可以消除 Adam 提到的“任意命令”漏洞,而无需编写像 sed 那样丑陋的代码。

      【讨论】:

        【解决方案3】:

        只需引用您的变量即可保留换行符。

        DATE="1/1/2010"
        TIME="12:00"
        TMP=$(cat file.txt)
        echo "$TMP"
        

        对于您可以使用变量修改文件中的值 -

        while read -r line
        do 
           sed -e "s@\$DATE@$DATE@" -e "s@\$TIME@$TIME@" <<< "$line"
        done < file.txt
        

        测试:

        [jaypal:~/Temp] cat file.txt
        The date is $DATE
        The time is $TIME
        [jaypal:~/Temp] DATE="1/1/2010"
        [jaypal:~/Temp] TIME="12:00"
        [jaypal:~/Temp] while read -r line; do sed -e "s@\$DATE@$DATE@" -e "s@\$TIME@$TIME@" <<< "$line"; done < file.txt
        The date is 1/1/2010
        The time is 12:00
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-06
          • 2018-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多