我正在尝试编写一个简单的脚本,它将通过标准输入接收文本并按原样输出所有内容,但它将替换遵循以下模式的出现:
{{env MYVAR}}
{{env PATH}}
{{env DISPLAY}}
与环境变量 MYVAR、PATH、DISPLAY 等的内容相关。
我的目标是不向该脚本传递任何参数,因此它将自动检测模式并用环境变量{{env VARNAME}}
的值替换。$VARNAME
该脚本通过标准输入获取输入并通过标准输出提供输出。
通过标准输入的示例输入文本:
This is a basic templating system that can replace environment variables in regular text files.
For example the DISPLAY in this system is {{env DISPLAY}} and the path is {{env PATH}}.
通过标准输出的预期输出:
This is a basic templating system that can replace environment variables in regular text files.
For example the DISPLAY in this system is :0.0 and the path is /bin;/usr/bin;/usr/local/bin.
我已尝试过:
到目前为止,我只设法通过命令行传递一个变量来完成此操作。
#!/bin/sh
# Check if the first argument is set
if [ -z "$1" ]; then
echo "No variable name provided." >&2
exit 1
fi
VARIABLE_NAME="$1"
# Use awk to replace '{{env VARIABLE_NAME}}' with the value of the environment variable
awk -v var_name="$VARIABLE_NAME" '
function escape(s) {
esc = "";
for (i = 1; i <= length(s); i++) {
c = substr(s, i, 1);
if (c ~ /[.[\]$()*+?^{|\\{}]/) {
esc = esc "\\" c;
} else {
esc = esc c;
}
}
return esc;
}
BEGIN {
search = "{{env " var_name "}}";
search_esc = escape(search);
replacement = ENVIRON[var_name];
}
{
gsub(search_esc, replacement);
print;
}'
因此,上述方法有效,但需要你做./parsing_script MYVAR
我想避免将环境变量指定为命令行参数。
架构/操作系统
我正在使用 FreeBSD 的 awk 及其 POSIX shell /bin/sh
笔记
如果 awk 不是合适的工具,我愿意听取解决方案(请不要使用 Python 或 Perl)。