Shell中如何单行封装含外部变量的长字符串写文件且无需转义
解决方案
不存在和你给出的伪代码<{ ... } >| doc.txt完全一致的原生shell单行写法:shell命令行参数解析逻辑天生会识别同一行内的引号、分号做语法处理,要绕开这个规则、同时保留外部变量解析能力、不需要转义内容特殊符号,最优方案是使用无引号分隔符的here-doc实现,你之前认为here-doc必须拆分两行属于认知误区。
- 通用兼容写法(零转义、自动替换变量、兼容所有POSIX标准shell)
使用不带任何引号包裹的here-doc分隔符(比如常用的EOF),此时shell会自动解析替换内容中所有$VARIABLE格式的外部变量,内容里的单引号、双引号、分号、空格全部按字面保留,不需要加任何转义符:
cat <<EOF >| doc.txt any text; "with double quotes"; some $VARIABLE here; and 'single quotes'; and semicolons; EOF
这里的换行是here-doc语法要求的固定分隔标记,不是业务逻辑上的代码拆分:在交互式终端输入时,输完第一行回车后shell会自动进入内容输入模式,直接粘贴待写入内容、再输入分隔符EOF回车即可完成写入;写在脚本中时整段是连续逻辑块,不需要额外拆分维护。
注意:不要给here-doc的分隔符加引号(比如不要写
<<'EOF'),加引号后会进入纯字面模式,所有变量都不会被解析替换,不符合需求。
- 不推荐here-string方案的原因
here-string如果用单引号包裹内容,会完全关闭变量解析;如果用双引号包裹内容,必须手动转义内容里的所有双引号、反引号、嵌套$标识,遇到包含大量引号的内容时维护成本极高,没有实用价值。
内容的提问来源于stack exchange,提问作者mr.tee
相关产品推荐
相关产品推荐

