显示加载了shell变量的文件内容

时间:2015-09-02 04:31:26

标签: linux bash shell

我知道sed可以帮助替换文件中的字符串。

我可以在没有sed的情况下显示加载了shell变量的文件内容吗?

对于我的情况,我有一个变量为/tmp/my_vars的文件,样本:

VAR_DIR="/etc/my_conf"
VAR_FILE_A="fileA"

准备模板为/tmp/my_template,示例:

File A is located in $VAR_DIR/$VAR_FILE_A .

我有一个bash脚本执行此操作(用于加载变量):

. /tmp/my_vars

我想知道我是否可以在脚本中显示一个简单的命令:

File A is located in /etc/my_conf/fileA .

无论如何,谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

纯壳溶液(不推荐)

. /tmp/my_vars
eval "echo $(cat /tmp/my_template)"

这种方法的问题在于它对文件eval中的任何内容运行/tmp/my_template。那可以是dangerous

awk解决方案(推荐)

awk是一个很好的工具:

$ awk -F'[="]+' 'FNR==NR{a["[$]"$1]=$2;next} {for (i in a) gsub(i,a[i]);} 1' /tmp/my_vars /tmp/my_template
File A is located in /etc/my_conf/fileA .

如何运作

首先读入/tmp/my_vars,收集所有替换信息。然后它会在/tmp/my_template中读取一次一行的替换。

  • -F'[="]+'

    这告诉awk使用="的任意组合作为字段分隔符

  • FNR==NR{ a[ "[$]" $1 ]=$2; next}

    当我们在第一个文件上时,即FNR==NR,我们为每行添加一个条目a,第一个字段作为键,第二个作为值。

    在键字符串的开头,我们添加一个美元符号。由于$是一个有效的正则表达式字符,因此我们将其放在方括号[$]中,以便将其视为常规字符。

  • for (i in a) gsub(i,a[i])

    对于a中的每个键,执行替换。当前行中显示密钥i的每个位置都会替换为值a[i]

  • 1

    打印线条。

在多行格式化

对于那些喜欢他们的代码分布在多行的人:

awk -F'[="]+' '
FNR==NR{
    a["[$]"$1]=$2
    next
}

{
    for (i in a) gsub(i,a[i])
}

1

答案 1 :(得分:0)

如果您希望加载my_vars的过程打印出从该文件加载的所有变量,您可以将以下内容添加到my_vars的底部:

# Permit extended notation for parameter expansion
shopt -s extglob

# Step through the file, printing lines that look like variable assignments
while read line; do
  case "$line" in
    +([A-Z_])=*)
      var="${line%%=*}"
      eval "echo \"Variable '$var' is set to '\$$var'\""
      ;;
  esac
done < $BASH_SOURCE

这只会将您的变量转储到源文件中。它不会将内容汇编到目录和文件名中作为您指定的问题中的示例。这种程序集将根据变量进行自定义,而不是像这样的通用解决方案的范围。在这种情况下,您可以添加到您的脚本:

echo "File A is located in ${VAR_DIR}/${VAR_FILE_A}"

以及在加载文件时要查看其内容的任何其他变量的类似行。