我知道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 .
无论如何,谢谢你的帮助。
答案 0 :(得分:0)
. /tmp/my_vars
eval "echo $(cat /tmp/my_template)"
这种方法的问题在于它对文件eval
中的任何内容运行/tmp/my_template
。那可以是dangerous。
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}"
以及在加载文件时要查看其内容的任何其他变量的类似行。