所以我有一个疯狂的想法,就是将文档嵌入到脚本中(这对我而言并不新鲜,只是新的),然后使用sed解析它们。我可以通过用行定界符注释掉一段文本,然后在将字符串打印到stdout时弹出注释哈希(在每一行上)来实现此目的。
作为示例,想象一个像这样的shell脚本myscript.sh
:
#!/usr/bin/env bash
#---- doc:start ----#
# Hello $User\n
# This is myscript.sh
# ${red}This will be red!${eol}
#---- doc:end ----#
printf "Hello, World!"
我有一个sed脚本,该脚本可捕获线里程表之间的所有内容,并将其放入多行变量$doc
使用此变量,我想对任何局部变量(不一定是导出的变量),转义代码,术语颜色等进行插值,在查看如何执行此操作时,我唯一能找到的答案就是使用eval;这是一个工作示例(在这里使用字符串):
while IFS= read -r line; do
line=$(eval "echo -e \"$line\"");
echo "$line"
done <<< "$doc"; # doc is a multiline variable
但是,如果有人在此文本块中添加$(rm -rf ..)
,它将被执行;这种模式似乎允许其他unsafe方案。
[我看过的另一种方法是使用printf -v line ...
动态分配变量,但无法成功进行变量替换。
我想在Bash 3.2上下文中实现此目标,而无需安装任何其他工具或实用程序;尽可能使用POSIX,但是Bashism和通用实用程序也可以。
也许是一个正则表达式,也可以排除看起来像可执行命令的东西(或其他超级转义的可疑字符串)。