Shell 脚本中如何使用 here document 实现多行文本输入? (中等)

👨‍⚕️ 主页: gis分享者

👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍⚕️ 收录于专栏:Shell 面试

文章目录

  • 一、🍀前言
    • [1.1 ☘️示例](#1.1 ☘️示例)
    • [1.2 ☘️使用语法](#1.2 ☘️使用语法)
    • [1.3 ☘️知识扩展](#1.3 ☘️知识扩展)

一、🍀前言

在 Shell 脚本中,Here Document 是一种通过内联多行文本为命令提供输入的方式,常用于生成文件内容或向交互式命令传递输入。。

1.1 ☘️示例

在 Shell 脚本中,here document 用于将多行文本作为标准输入送给一个命令。语法如下:

powershell 复制代码
命令 <<-delimiter
    多行输入
delimiter

举个例子,如果我们想创建一个文件并将多行文本写入该文件,可以这样做:

powershell 复制代码
cat <<-EOF > myfile.txt
This is line 1
This is line 2
EOF

在这个例子中,文本 "This is line 1" 和 "This is line 2" 会被写入 myfile.txt 文件中。

1.2 ☘️使用语法

在 Shell 脚本中,here document(文档内联输入)通过 << 操作符实现多行文本输入,其标准语法为:

powershell 复制代码
command << DELIMITER
多行文本内容
DELIMITER

关键特性及用法:

1. 基础应用

将多行文本传递给命令:

powershell 复制代码
cat << EOF
第一行文本
第二行文本
包含变量的值:$PATH
EOF

2. 抑制变量扩展

使用单引号包裹分隔符可禁止变量替换:

powershell 复制代码
cat << 'EOF'
原始内容 $PATH 不会被解析
EOF

3. 缩进处理

添加 - 前缀支持前置制表符(仅限 Tab):

powershell 复制代码
cat <<- EOF
   带缩进的文本(Tab键缩进)
EOF

4. 变量赋值

通过 read 或子 shell 捕获多行内容:

powershell 复制代码
read -r -d '' content << EOF
多行文本存入变量
第二行
EOF

5. 管道传递

直接输出到其他命令:

powershell 复制代码
grep "key" << EOF
line1 with key
line2 without
EOF

注意事项:

  • 默认行为会解析变量、命令替换和转义字符
  • 终止标记必须独占一行且无前导/后置空格
  • 若需二进制安全处理,建议结合 printf 使用

此机制适用于批量配置生成、交互式脚本应答及模板化输出等场景。

1.3 ☘️知识扩展

使用 here document 有几个需要注意的点和实用技巧:

1. 自定义边界符: 在 << 之后的 "EOF" 是一个边界符,可以根据需要自定义,例如 "END" 或其他不常见的字符串。边界符不会出现在最终的输出中。

2. 嵌入变量: 在 here document 中可以插入变量:

powershell 复制代码
name="John"
cat <<-EOF
Hello, $name.
EOF

输出:

powershell 复制代码
Hello, John.

这样可以在多行输入中嵌入变量值。

3. 防止变量替换: 如果不希望变量在文本中被替换,可以在 delimiter 前使用单引号:

powershell 复制代码
name="John"
cat <<-'EOF'
Hello, $name.
EOF

输出:

powershell 复制代码
Hello, $name.

这样会确保 $name 作为字符串而不是变量被解释。

4. 缩进和空格处理: 通常,在 <<- 中使用减号 - 可以忽略行前的制表符,但不能忽略普通空格:

powershell 复制代码
cat <<-EOF
    This line will be correctly indented.
        This line too.
EOF

5. 将多行文本提供给命令: 除了 cat 命令,here document 还可以用于将多行文本送入其他命令,如 SQL 语句的输入。

powershell 复制代码
mysql -u root -p <<-EOSQL
CREATE DATABASE my_database;
USE my_database;
CREATE TABLE my_table (id INT, name VARCHAR(255));
EOSQL

这样直接在命令行或脚本中运行一系列 SQL 语句。

相关推荐
寺中人18 小时前
Linux 基础命令入门实战教程:从零掌握常用操作,新手快速上手
linux·运维·服务器·shell·linux 命令·linux 基础教程·linux 入门
k4m7v2pz4 天前
34 天 33 个版本:rvs(rust-verb-shell)如何用版本号对抗 AI 误判
rust·shell·命令行工具·ai agent·系统信息·跨平台开发
笨笨狗吞噬者4 天前
IRIS: shell 中的智能实时输入提示工具
github·shell
Lyra_Infra7 天前
Java 应用启动脚本 JDK 路径适配优化文档
java·shell
寒水馨9 天前
macOS下载、安装PowerShell-v7.6.4(附安装包powershell-7.6.4-osx-arm64.pkg)
macos·自动化·跨平台·shell·脚本·命令行·powershell
爱码少年10 天前
一条Shell命令实现文件目录服务器间快速转移
服务器·shell
重生的黑客12 天前
Linux 进程程序替换与自定义 Shell:从 exec 函数族到命令行解释器
linux·运维·服务器·shell
逻极15 天前
Shell脚本实战:从“能跑”到“高效”的3个关键跃升
linux·服务器·shell·脚本
k4m7v2pz16 天前
rvs(rust-verb-shell)v26.7.12 更新:借鉴 ripgrep、自身可观测、修了 mkdir
rust·shell
k4m7v2pz17 天前
rvs(rust-verb-shell):一款面向人类和 AI Agent 的结构化 Shell
rust·shell·基建·rust-verb-shell·verb-noun