我的意思是类似于这个
<{ any text; "with double quotes"; some $VARIABLE here; and 'single quotes'; and semicolons; } >| doc.txt
我们有几个引号类型和许多嵌套变量需要解决。
我们不想逃避符号。
有了这里的文件,你必须有两行。
使用here字符串,必须转义所有嵌套的引号。
有什么合乎逻辑的解决方案吗?
如果当前执行的脚本是一个实际存在的文件,则可以获取当前行并从中提取要保留的文本,而文本可以存储为特殊分隔符后的注释。使用envsubst
,可以替换导出变量的变量展开式。大致情况:
sed -n "${BASH_LINENO}s/.*### //p" "$0" | VARIABLE="$VARIABLE" envsubst '$VARIABLE' > doc.txt ### any text; "with double quotes"; some $VARIABLE here; and 'single quotes'; and semicolons;
您也可以以同样的方式创建一个eval
,它将在eval
生成的单行文档中使用该行内容:
eval "cat <<EOF$(echo)$(sed -n "${BASH_LINENO}s/.*### //p" "$0")$(echo EOF)" > doc.txt ### any text; "with double quotes"; some $VARIABLE here; and 'single quotes'; and semicolons;
使用base64 -w0
(或许多其他编码),您可以将任何脚本(也是多行)编码为一行。从下面删除echo
以实际执行脚本。
echo eval "$(base64 -d <<<Y2F0IDw8RU9GCmFueSB0ZXh0OyAid2l0aCBkb3VibGUgcXVvdGVzIjsgc29tZSAkVkFSSUFCTEUgaGVyZTsgYW5kICdzaW5nbGUgcXVvdGVzJzsgYW5kIHNlbWljb2xvbnM7CkVPRgo=)" > doc.txt