欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

linux Here Document AG chatgpt 有大用 有大大用

linux Here Document  

在 Linux 或 Unix shell 脚本中,Here Document(通常缩写为 "heredoc")是一种重定向输入的方式,允许在脚本中直接嵌入多行文本,并将其作为命令的标准输入。它的语法以 << 开头,后跟一个自定义的分隔符标识符(通常是 EOF 或 END),直到再次遇到该标识符为止的所有内容都会被作为输入传递给命令。


基本语法:

bash
命令 <<分隔符 多行文本内容... ... 分隔符

示例 1:简单文本输入

bash
cat <<EOF 这是第一行 这是第二行 这是第三行 EOF

输出:

这是第一行
这是第二行
这是第三行

常见用法:

  1. 将多行文本传递给命令
    例如,用 cat 显示多行内容,或用 ftp 等工具发送交互式命令:

    bash
    ftp -n <<END open example.com user username password binary get file.txt quit END
  2. 写入文件

    bash
    cat > output.txt <<EOF 文件内容第一行 文件内容第二行 EOF
  3. 在脚本中生成配置文件

    bash
    cat > /etc/nginx.conf <<'END_CONFIG' server {    listen 80;    server_name example.com;    root /var/www/html; } END_CONFIG

注意事项:

  1. 变量替换

    示例:

    bash
    name="World" cat <<EOF Hello $name  # 输出 "Hello World" EOF cat <<'EOF' Hello $name  # 输出 "Hello $name" EOF
  • 如果分隔符不加引号(如 <<EOF),则文本中的变量和命令会被展开。

  • 如果分隔符加引号(如 <<'EOF'),则文本内容会原样传递,不进行变量替换或命令执行。

  • 缩进问题

    • 默认情况下,分隔符必须顶格写(不能缩进)。

    • 如果希望缩进(如美观的脚本格式),可以用 <<- 并配合 Tab 缩进(注意不是空格):

      bash
      cat <<-EOF    This line is indented with tabs. EOF
  • 特殊字符
    Here Document 中的文本会保留换行符、空格等格式,但需注意特殊字符(如 $、反引号)是否被意外解析。


  • 高级用法:

    • 嵌套 Here Document:通过不同分隔符实现嵌套(但需谨慎处理)。

    • 结合 tee:同时输出到屏幕和文件:

      bash
      tee /path/to/file <<EOF Multi-line content EOF

    总结:

    Here Document 是 Shell 脚本中处理多行输入的强大工具,常用于动态生成文件、交互式命令输入或配置模板。理解其变量展开和缩进规则能避免常见错误。


    命令 <<分隔符 与 命令 <<<分隔符 区别

    两个左尖括号与三个左尖括号的区别

    在 Linux/Unix shell 中,<<(Here Document)和 <<<(Here String)都是输入重定向的方式,但它们的用途和行为有显著区别:


    1. <<(Here Document)

    作用

    将 多行文本 作为命令的标准输入,直到遇到指定的结束分隔符。

    语法

    bash
    命令 <<分隔符 多行文本... 分隔符

    特点

    • 输入是多行文本,以独立的分隔符(如 EOF)标记开始和结束。

    • 默认会解析文本中的变量、命令替换(如 $var 或 $(command)),除非分隔符被引号包裹(<<'EOF')。

    • 缩进需用 Tab(若用 <<- 可忽略前导 Tab)。

    示例

    bash
    cat <<EOF Hello $USER  # 变量会被替换 Today is $(date) EOF

    输出

    Hello alice  
    Today is Mon Jul 1 12:00:00 UTC 2024
    

    2. <<<(Here String)

    作用

    将 单行字符串 直接作为命令的标准输入。

    语法

    bash
    命令 <<<"字符串"

    特点

    • 输入是单行内容,无需结束符。

    • 同样会解析变量和命令替换(类似双引号字符串的行为)。

    • 是 Bash、Zsh 等现代 Shell 的特性(非所有 POSIX Shell 支持)。

    示例

    bash
    grep "hello" <<<"hello world"  # 等价于 echo "hello world" | grep "hello" wc -c <<<"123"                # 统计字符数(输出 4,包括换行符)

    输出

    hello world
    4
    

    关键区别

    特性<<(Here Document)<<<(Here String)
    输入内容多行文本单行字符串
    是否需要结束符是(如 EOF
    变量/命令替换默认解析(可禁用)始终解析
    Shell 兼容性所有 POSIX ShellBash/Zsh(非 POSIX 标准)
    典型用途生成配置文件、交互式输入快速传递单行数据

    何时使用?

    • <<:需输入多行内容时(如脚本中生成文件、数据库查询、长命令输入)。

    • <<<:需直接传递单行字符串时(替代 echo "str" | command 更高效)。


    高级示例

    1. 禁用变量替换(<<'EOF'

    bash
    cat <<'EOF' $USER will not expand  # 原样输出 EOF

    2. Here String 与数学运算

    bash
    bc <<<"5 + 3"  # 输出 8(直接计算)

    3. 嵌套使用

    bash
    cat <<EOF1 $(cat <<EOF2 嵌套内容 EOF2 ) EOF1

    总结:

    • << 是多行输入的重定向工具,适合处理复杂文本块。

    • <<< 是单行输入的快捷方式,适合简单字符串传递。



    普通分类: