欢迎各位兄弟 发布技术文章
这里的技术是共享的
linux Here Document
在 Linux 或 Unix shell 脚本中,Here Document(通常缩写为 "heredoc")是一种重定向输入的方式,允许在脚本中直接嵌入多行文本,并将其作为命令的标准输入。它的语法以 <<
开头,后跟一个自定义的分隔符标识符(通常是 EOF
或 END
),直到再次遇到该标识符为止的所有内容都会被作为输入传递给命令。
bash命令 <<分隔符 多行文本内容... ... 分隔符
bashcat <<EOF 这是第一行 这是第二行 这是第三行 EOF
输出:
这是第一行
这是第二行
这是第三行
将多行文本传递给命令
例如,用 cat
显示多行内容,或用 ftp
等工具发送交互式命令:
bashftp -n <<END open example.com user username password binary get file.txt quit END
写入文件
bashcat > output.txt <<EOF 文件内容第一行 文件内容第二行 EOF
在脚本中生成配置文件
bashcat > /etc/nginx.conf <<'END_CONFIG' server { listen 80; server_name example.com; root /var/www/html; } END_CONFIG
变量替换
示例:
bashname="World" cat <<EOF Hello $name # 输出 "Hello World" EOF cat <<'EOF' Hello $name # 输出 "Hello $name" EOF
如果分隔符不加引号(如 <<EOF
),则文本中的变量和命令会被展开。
如果分隔符加引号(如 <<'EOF'
),则文本内容会原样传递,不进行变量替换或命令执行。
缩进问题
默认情况下,分隔符必须顶格写(不能缩进)。
如果希望缩进(如美观的脚本格式),可以用 <<-
并配合 Tab 缩进(注意不是空格):
bashcat <<-EOF This line is indented with tabs. EOF
特殊字符
Here Document 中的文本会保留换行符、空格等格式,但需注意特殊字符(如 $
、反引号)是否被意外解析。
嵌套 Here Document:通过不同分隔符实现嵌套(但需谨慎处理)。
结合 tee
:同时输出到屏幕和文件:
bashtee /path/to/file <<EOF Multi-line content EOF
Here Document 是 Shell 脚本中处理多行输入的强大工具,常用于动态生成文件、交互式命令输入或配置模板。理解其变量展开和缩进规则能避免常见错误。
命令 <<分隔符 与 命令 <<<分隔符 区别
两个左尖括号与三个左尖括号的区别
在 Linux/Unix shell 中,<<
(Here Document)和 <<<
(Here String)都是输入重定向的方式,但它们的用途和行为有显著区别:
<<
(Here Document)将 多行文本 作为命令的标准输入,直到遇到指定的结束分隔符。
bash命令 <<分隔符 多行文本... 分隔符
输入是多行文本,以独立的分隔符(如 EOF
)标记开始和结束。
默认会解析文本中的变量、命令替换(如 $var
或 $(command)
),除非分隔符被引号包裹(<<'EOF'
)。
缩进需用 Tab(若用 <<-
可忽略前导 Tab)。
bashcat <<EOF Hello $USER # 变量会被替换 Today is $(date) EOF
输出:
Hello alice
Today is Mon Jul 1 12:00:00 UTC 2024
<<<
(Here String)将 单行字符串 直接作为命令的标准输入。
bash命令 <<<"字符串"
输入是单行内容,无需结束符。
同样会解析变量和命令替换(类似双引号字符串的行为)。
是 Bash、Zsh 等现代 Shell 的特性(非所有 POSIX Shell 支持)。
bashgrep "hello" <<<"hello world" # 等价于 echo "hello world" | grep "hello" wc -c <<<"123" # 统计字符数(输出 4,包括换行符)
输出:
hello world
4
特性 | << (Here Document) | <<< (Here String) |
---|---|---|
输入内容 | 多行文本 | 单行字符串 |
是否需要结束符 | 是(如 EOF ) | 否 |
变量/命令替换 | 默认解析(可禁用) | 始终解析 |
Shell 兼容性 | 所有 POSIX Shell | Bash/Zsh(非 POSIX 标准) |
典型用途 | 生成配置文件、交互式输入 | 快速传递单行数据 |
<<
:需输入多行内容时(如脚本中生成文件、数据库查询、长命令输入)。
<<<
:需直接传递单行字符串时(替代 echo "str" | command
更高效)。
<<'EOF'
)bashcat <<'EOF' $USER will not expand # 原样输出 EOF
bashbc <<<"5 + 3" # 输出 8(直接计算)
bashcat <<EOF1 $(cat <<EOF2 嵌套内容 EOF2 ) EOF1
总结:
<<
是多行输入的重定向工具,适合处理复杂文本块。
<<<
是单行输入的快捷方式,适合简单字符串传递。