1. 理解Bash中的多行字符串需求
在日常的Shell脚本编写中,我们经常需要处理文本内容。标准的Bash字符串通常是单行的,但当我们需要处理配置文件、长文本消息或格式化输出时,单行字符串就显得力不从心了。这就是多行字符串发挥作用的地方。
多行字符串在以下场景特别有用:
- 生成格式化的报告或日志
- 创建复杂的配置文件(如JSON、XML)
- 编写带有换行的用户提示信息
- 构建SQL查询语句
- 编写HTML模板
在Bash中处理多行字符串时,有几个关键点需要注意:
- 字符串中的换行符需要被正确保留
- 特殊字符(如$、`、\等)可能需要转义
- 字符串的缩进会影响最终输出格式
- 变量扩展行为在多行字符串中需要特别注意
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 使用Heredoc创建多行字符串
2.1 Heredoc基础语法
Heredoc(Here Document)是Bash中创建多行字符串最直观的方法。它的基本语法结构如下:
bash复制variable_name=$(cat <<DELIMITER
第一行内容
第二行内容
...
DELIMITER
)
这里的DELIMITER是一个自定义的标记,用于标识多行字符串的开始和结束。这个标记可以是任何不包含在字符串内容中的单词,常见的用法包括使用EOF、END或自定义的标记。
2.2 Heredoc实际应用示例
让我们看一个更实用的例子,假设我们要创建一个包含用户信息的字符串:
bash复制user_info=$(cat <<USERDATA
姓名: 张三
年龄: 30
邮箱: zhangsan@example.com
地址:
北京市海淀区
中关村大街1号
USERDATA
)
echo "$user_info"
这个脚本会输出格式化的用户信息,保留所有的换行和缩进。
2.3 Heredoc的高级用法
Heredoc还支持一些高级特性:
-
忽略前导制表符:在<<后添加-可以忽略行首的制表符(但不包括空格)
bash复制cat <<-EOF 这行前面的制表符会被忽略 EOF -
引用分隔符:使用<<'DELIMITER'可以禁用变量扩展和命令替换
bash复制cat <<'EOF' 当前目录是$PWD EOF -
嵌套Heredoc:可以在脚本中嵌套使用多个Heredoc
bash复制cat <<'OUTER' 外层内容 $(cat <<'INNER' 内层内容 INNER ) OUTER
注意:使用Heredoc时,结束标记必须单独成行,且前后不能有任何字符(包括空格)。这是新手常犯的错误。
3. 使用printf处理多行字符串
3.1 printf基础用法
printf是另一个处理多行字符串的强大工具。与Heredoc不同,printf通过转义序列(如\n)来表示换行:
bash复制multiline_string="第一行\n第二行\n第三行"
printf "$multiline_string"
或者更常见的用法是直接使用printf:
bash复制printf "第一行\n第二行\n第三行\n"
3.2 printf的格式化能力
pr
