Bash中END块末尾换行失效及无END块变量替换问题
Bash脚本换行与变量替换问题解决方案
问题1:让Here-doc(END块)末尾的换行生效
Here-doc默认会忽略结束标记前的最后一个换行,可通过以下两种方法解决:
方法1:在Here-doc内容末尾添加空行
直接在END标记前新增一行空内容,即可保留末尾的换行:
var1="test content" string=$(cat <<END line1 $var1 END ) # 输出时末尾会有换行,bar不会紧跟最后一行文本 echo "$string"bar
方法2:在赋值命令后追加echo
如果不想修改Here-doc原有内容,可在cat命令后拼接echo,强制输出一个换行:
var1="test content" string=$(cat <<END line1 $var1 END ; echo) echo "$string"bar
问题2:不使用Here-doc实现变量替换且无需大量转义
推荐使用printf结合占位符的方式,既支持变量替换,又无需转义内容中的引号:
示例代码
var1="custom value" # 用单引号包裹格式字符串,内部引号无需转义,变量通过%s占位符传入 string=$(printf 'line1\n"quoted content"\n%s\nlast line\n' "$var1") echo "$string"
这种方式下,格式字符串里的双引号、特殊字符都不需要额外转义,变量通过占位符完成替换,简洁且易维护。
如果偏好直接拼接字符串,也可以用$'\n'表示换行,结合单引号与变量拼接:
var1="custom value" string='line1 "quoted content"'$'\n'"$var1"$'\n'"last line" echo "$string"
但该方式可读性略差,优先推荐printf方案。
内容的提问来源于stack exchange,提问作者stackbiz
相关产品推荐
相关产品推荐

