对于我的项目,我需要一种基于模板文件生成一些文件的方法。我设想是这样的:
模板文件包含类似于
{{var1}}
要替换的变量的数据key = value
其他文件包含值列表应用工具后,应生成一个包含具体值的新文件
可以通过命令行提供对的列表,而不是第二个文件key = value
,或者,同样的,某些键可能需要环境变量而不是第二个文件中的键值。
在那儿标准和众所周知的实用程序在Linux/Unix世界中使用可以做到这一点吗?
答案1
编写这样的脚本确实很容易。例如,您可以来源成对的文件key=value
,然后用它来替换模板的内容。例如:
$ cat template
Hello $name,
someone told me you really like $thing!
$ cat values
name=Bob
thing=chocolate
那么你的脚本将是:
#!/bin/sh
## source the key/value pairs
. "$1"
## Replace them in the template
sed -e "s/\\\$name/$name/g" -e "s/\\\$thing/$thing/g" "$2"
你像这样运行它:
$ foo.sh /full/path/to/values template
Hello Bob,
someone told me you really like chocolate!
当然,这需要您提前知道按键的名称。另一种选择是:
#!/bin/sh
tmpFile=$(mktemp)
cp -- "$2" "$tmpFile"
while IFS='=' read -r key value; do
sed -i -e "s/\$$key/$value/g" "$tmpFile"
done < "$1"
cat "$tmpFile"
另一种选择是使用eval
扩展变量。然而,这是危险的,因为如果文件中的值可能是危险的,它会让您面临代码注入的风险。如果这对您来说不是问题,请尝试:
#!/bin/sh
## source the key/value pairs
. "$1"
## load the contents of the template
template="$(cat "$2")"
## Now print, but expanding the variables. We need to
## unset IFS to protect the newlines.
IFS=
eval echo \"$template\"