Linux的`<< EOF`(Here-Document)詳解多回答筆記250722

Linux的<< EOF(Here-Document)詳解多回答筆記250722

Linux 中的 << EOF 結構稱為 Here Document(立即文檔或嵌入文檔),它是一種在 Shell 腳本中直接嵌入多行文本輸入流(通常作為命令的標準輸入)的方式。EOF 只是一個標記(可自定義),用于標識文本的開始和結束位置。


???? 基本語法

command << EOF
文本內容...
多行文本...
EOF
  • command:接收標準輸入的命令(如 cat, grep, ssh, mysql 等)。
  • << EOF:聲明 Here Document 的開始,EOF結束標記符(常用 EOFEND,但可自定義)。
  • 文本內容:所有在 << EOFEOF 之間的行都會作為 command 的輸入。
  • EOF:單獨一行,表示文本結束(必須頂格寫,前后不能有空格)。

???? 關鍵特性與用法

???????? 1. 自定義結束標記
EOF 可替換為任意大寫字母單詞(如 MARKEREND):

cat << MYEND
第一行
第二行
MYEND

???????? 2. 縮進問題 - <<- 消除縮進
默認情況下,結束標記必須頂格(無縮進)。使用 <<- 可忽略結束標記前的 Tab 制表符注意:空格無效!):

cat <<- EOF第一行(有縮進)第二行(有縮進)EOF  # 用 Tab 縮進,會被忽略

???????? 3. 變量與命令替換
默認情況下,Here Document 內的變量、命令和轉義字符會被解析

name="Alice"
cat << EOF
Hello, $name!  # 輸出 Hello, Alice!
Today is $(date).
EOF

???????? 4. 禁用替換 - 單引號結束標記
在結束標記前加單引號<< 'EOF'),可禁止變量替換、命令替換和轉義:

cat << 'EOF'
$name  # 原樣輸出 $name
$(date) # 原樣輸出 $(date)
EOF

???????? 5. 管道與重定向
Here Document 可與其他重定向結合:

# 輸出到文件
cat << EOF > output.txt
內容...
EOF# 作為管道輸入
grep "key" << EOF
line1
key line
line3
EOF

???? 常見應用場景

???????? 1. 生成配置文件

cat > config.yaml << EOF
server:port: 8080host: 0.0.0.0
database:url: jdbc:mysql://localhost/db
EOF

???????? 2. 執行多行交互命令

# 遠程執行命令
ssh user@host << EOF
cd /path
git pull
sudo systemctl restart app
EOF# 數據庫操作
mysql -u root -p << EOF
USE mydb;
SELECT * FROM users;
EOF

???????? 3. 腳本內多行注釋
利用 :(空命令)和禁用替換的 Here Document:

: << 'COMMENT'
這段是注釋內容
不會被解析執行
COMMENT

???????? 4. 創建多行字符串變量

read -r -d '' help_msg << EOF
Usage: $0 [options]
Options:-h  Show help-v  Enable verbose
EOF
echo "$help_msg"

???? 高級用法

???????? 1. Here Document + sudo

# 將內容寫入需 root 權限的文件
sudo tee /etc/config.conf << EOF
[Settings]
key=value
EOF

???????? 2. 嵌套 Here Document
需謹慎處理結束標記:

cat << EOF
外層內容
cat << INNER
內層內容
INNER
EOF

???????? 3. 與 expect 結合(自動化交互)

expect << EOF
spawn ssh user@host
expect "password:"
send "mypass\r"
expect eof
EOF

???? 總結

特性語法作用
基本用法<< EOF嵌入多行文本
忽略 Tab 縮進<<- EOF允許結束標記前有 Tab 縮進
禁用替換<< 'EOF'原樣輸出文本內容
輸出到文件> file將嵌入文本重定向到文件
注釋塊: << 'COMMENT'實現多行注釋

掌握 Here Document 能極大提升 Shell 腳本處理多行輸入的靈活性和可讀性,尤其適用于配置生成、遠程命令執行和交互自動化等場景。










在Linux Shell腳本中,<< EOF 是一種稱為 Here Document(或 Here-Doc)的結構,用于將多行文本直接作為輸入傳遞給命令或腳本。以下是詳細解析:


???? 基本語法

command << DELIMITER文本內容...多行輸入...
DELIMITER
  • command:接收輸入的命令(如 catgrepssh 或腳本)。
  • DELIMITER:自定義終止標記(常用 EOF/END,但可替換為任意字符串)。
  • 文本塊:位于兩個 DELIMITER 之間的內容會作為 command 的輸入。

???? 核心特性

  1. 變量擴展(默認開啟)

    name="Alice"
    cat << EOF
    Hello, $name!  # 變量會被解析
    Today is $(date)
    EOF
    

    輸出:

    Hello, Alice!
    Today is Tue Jul 22 10:00:00 UTC 2025
    
  2. 禁用變量擴展(使用 <<'DELIMITER'

    cat <<'EOF'
    $name  # 原樣輸出,不解析變量
    `ls`   # 不執行命令
    EOF
    

    輸出:

    $name
    `ls`
    
  3. 縮進處理(<<- 忽略開頭的制表符)

    cat <<- EOFThis line has a tab.This too.  # 行首制表符會被自動忽略
    EOF
    

    注意:僅忽略 制表符(Tab),空格仍需手動處理。


???? 常見應用場景

  1. 生成配置文件

    cat > /etc/nginx.conf << EOF
    server {listen 80;server_name example.com;root /var/www/html;
    }
    EOF
    
  2. 執行多行命令(如 ssh

    ssh user@host << EOF
    cd /tmp
    touch test.txt
    echo "Done" > test.txt
    EOF
    
  3. 創建腳本

    bash << EOF
    echo "Running in subshell"
    if [ -f "/tmp/file" ]; thenrm -f /tmp/file
    fi
    EOF
    
  4. sudo 配合

    sudo tee /etc/file.conf > /dev/null << EOF
    [Settings]
    PORT=8080
    DEBUG=false
    EOF
    

???? 重要注意事項

  1. 終止標記必須獨占一行

    # 正確
    cat << EOF
    content
    EOF# 錯誤(EOF前有空格)
    cat << EOF
    contentEOF  # 腳本報錯
    
  2. 標記符選擇

    • 避免使用與內容沖突的標記(如內容含 EOF 時改用 END)。
    • 大小寫敏感(EOFeof)。
  3. 特殊字符轉義

    • 在非引號模式下(<< EOF),需轉義 $\ 等符號:
      cat << EOF
      Price: \$100
      Path: /usr/bin
      EOF
      

???? 高級用法

  1. 嵌套使用

    cat << 'OUTER'cat << INNERInner Here-DocINNER
    OUTER
    
  2. 管道傳遞

    cat << EOF | grep "Hello"
    Hello World
    Goodbye
    EOF
    
  3. 結合 awk/sed 處理文本

    awk '{print $1}' << EOF
    Apple 10
    Banana 20
    EOF
    # 輸出: Apple\nBanana
    

???? 總結

特性語法作用
變量擴展<< EOF解析變量/命令
禁用擴展<< 'EOF'原樣輸出文本
忽略行首制表符<<- EOF允許代碼縮進(僅Tab有效)

掌握 Here Document 能極大簡化腳本中對多行文本的處理,尤其適用于配置生成、遠程命令執行等場景。使用時注意終止標記的書寫規范,并根據需求選擇是否啟用變量擴展。










Linux 的 << EOF (Here Document) 詳解

???? 1. 基本概念

  • Here Document 是一種 Shell 重定向技術,用于將多行文本直接傳遞給命令的標準輸入(stdin)。
  • 語法:命令 << 分隔符,后跟文本內容,以單獨一行的分隔符結束。
  • 默認支持變量替換和命令替換(類似雙引號"的行為)。

???? 2. 基礎語法

命令 << EOF
文本行1
文本行2
...
EOF

示例

cat << EOF
Hello, World!
Today is $(date)  # 命令替換
User: $USER       # 變量替換
EOF

輸出

Hello, World!
Today is Tue Jul 22 10:00:00 CST 2025
User: your_username

???? 3. 禁用替換:引號包裹分隔符

  • 用單引號 'EOF' 包裹分隔符可禁用替換(類似單引號'的行為)。
cat << 'EOF'
Hello, $USER  # 變量不替換
Today is $(date)  # 命令不執行
EOF

輸出

Hello, $USER
Today is $(date)

???? 4. 縮進文本:<<- 用法

  • 使用 <<- 可忽略結束分隔符前的 Tab 制表符(空格無效)。
cat <<- EOFHello!  # 此行有 Tab 縮進EOF    # 結束符前必須有 Tab

輸出(無縮進):

Hello!

???? 5. 高級用法

  • 管道傳遞:與其他命令組合

    grep "key" << EOF
    line1: key value
    line2: no match
    EOF
    

    輸出line1: key value

  • 寫入文件:替代 echo

    cat > output.txt << EOF
    File content
    EOF
    
  • SSH 執行遠程命令

    ssh user@host << EOF
    echo "Running on \$HOSTNAME"
    uptime
    EOF
    
  • 多行注釋(利用 : 空命令):

    : << 'COMMENT'
    這是被注釋的代碼塊
    echo "不會執行"
    COMMENT
    

???? 6. 注意事項

  1. 分隔符唯一性:文本內避免出現分隔符字符串。
  2. 空格敏感<<- 僅忽略 Tab,不忽略空格。
  3. 命令位置:結束分隔符必須單獨一行且頂格(或用 Tab)。

???? 7. 應用場景

  • 腳本中生成配置文件(如 Dockerfile、nginx.conf)。
  • 向交互式命令傳遞多行輸入(如 ftppsql)。
  • 編寫內聯文檔或幫助信息。

???? 示例:動態生成 SQL 文件

mysql -u root << EOF
CREATE DATABASE mydb;
USE mydb;
CREATE TABLE users (id INT, name VARCHAR(30));
EOF

提示:結合 tee 可同時輸出到屏幕和文件:
cat << EOF | tee file.txt










Linux 中的 << EOF(通常稱為 Here DocumentHeredoc)是一種強大的 Shell 輸入重定向機制,用于將多行文本塊直接作為命令的標準輸入。它極大地簡化了在腳本中向命令提供大量輸入或創建多行字符串的操作。

核心語法:

command <<[-]DELIMITERText Line 1Text Line 2...Text Line N
DELIMITER
  • command:接收輸入的命令(如 cat, grep, sed, ssh, mysql, ftp, cat > file 等)。
  • <<:Here Document 的起始標記。
  • [-]:可選的連字符 -常用且推薦)。如果使用 <<-(帶短橫線),則 Here Document 內容內部行前導制表符(Tab) 會被 Shell 自動忽略。這允許你在腳本中縮進 Heredoc 內容以保持代碼美觀,而不會將這些制表符作為輸入的一部分傳遞給命令。注意: 只能忽略制表符,不能忽略空格。
  • DELIMITER(如 EOF, END, MYMARK):一個用戶自定義的單詞或字符串(結束標記),用于標識 Here Document 文本塊的結束。它必須單獨成行,且前后不能有任何空格或其他字符(包括行首和行尾)。
  • Text Line 1 ... N:要傳遞給 command 的所有文本行。這些行會原樣(或根據引號規則處理變量和命令替換)作為 command 的標準輸入。

關鍵特性和規則:

  1. 結束標記 (DELIMITER):

    • 必須是單獨一行
    • 必須精確匹配開頭使用的標記(包括大小寫)。
    • 行首和行尾不能有任何空格。Shell 會逐字查找這個標記。
    • 常見的標記有 EOF (End Of File), END, STOP。使用 EOF 是一種廣泛接受的慣例,但你可以使用任何不包含空格且在文本塊中不會意外出現的字符串(避免 eof, EofEOF 混淆)。
  2. 引號與變量/命令替換:

    • 不加引號 (<< DELIMITER): Here Document 內容中的變量(如 $var)和命令替換(如 `date`$(date)會被 Shell 展開(替換)。這是最常見的用法。
    • 加單引號 (<< ‘DELIMITER’): Here Document 內容中的變量和命令替換不會被展開,所有字符(包括 $, `, \)都會被當作普通字符原樣傳遞給命令。適用于需要保留字面意義的文本(如生成包含 $ 的 SQL 代碼、配置文件模板)。
    • 加雙引號 (<< “DELIMITER”): 效果與不加引號幾乎相同(變量和命令替換會被展開),但允許在內容中使用雙引號本身(但通常沒必要特意用雙引號包裹 DELIMITER,不加引號也能處理內容中的雙引號)。
  3. 縮進與 <<- :

    • 使用 <<- DELIMITER(帶短橫線)時,Here Document 內容行前導制表符(Tab) 會被 Shell 忽略。這允許你將 Heredoc 內容與腳本邏輯對齊縮進。
    • 結束標記行也可以使用制表符縮進(且會被忽略),但仍必須精確匹配且前后無空格。
    • 重要: 只能忽略制表符 (Tab),不能忽略空格。在腳本編輯器中設置使用 Tab 縮進而非空格對于 <<- 至關重要。
  4. 輸入來源:

    • Here Document 的文本塊直接嵌入在腳本或命令行中,由 Shell 提供,不是從外部文件讀取。

基本示例:

  1. 簡單輸出 (cat):

    cat << EOF
    Hello, world!
    This is a multi-line
    Here Document example.
    Today is $(date).  # 命令替換會被執行
    EOF
    

    輸出:

    Hello, world!
    This is a multi-line
    Here Document example.
    Today is Tue Jul 22 12:34:56 CST 2025.  # 實際日期時間
    
  2. 避免替換 (加單引號):

    cat << 'LITERAL'
    This text will not be processed.
    Variable $HOME remains as is.
    Command `date` won't run.
    LITERAL
    

    輸出:

    This text will not be processed.
    Variable $HOME remains as is.
    Command `date` won't run.
    
  3. 縮進使用 (<<-):

    if true; thencat <<- INDENTEDThis line has a leading tab (ignored).So does this one.The closing INDENTED is also indented with a tab.INDENTED # 此行必須以 Tab 開頭,且后面無空格
    fi
    

    輸出:

    This line has a leading tab (ignored).
    So does this one.
    The closing INDENTED is also indented with a tab.
    
  4. 重定向到文件:

    cat > config.txt << CONFIG
    # Application Configuration
    host = "localhost"
    port = 8080
    log_level = "info"
    CONFIG
    
    • 這將創建一個名為 config.txt 的文件,內容就是 Heredoc 中的文本。
  5. 作為命令輸入 (mysql):

    mysql -u username -p << SQLINPUT
    USE mydatabase;
    SELECT * FROM users WHERE active = 1;
    SQLINPUT
    
    • 這會登錄 MySQL 并執行中間的兩條 SQL 語句。
  6. 結合管道 (grep):

    grep "important" << TEXT
    Line 1: not important
    Line 2: this is important
    Line 3: also not
    TEXT
    

    輸出:

    Line 2: this is important
    

常見用途:

  1. 腳本內文檔: 在腳本中生成幫助信息 (usage())。
  2. 配置文件生成: 在安裝或部署腳本中動態創建配置文件(如 Nginx、Apache、Dockerfile、systemd unit 文件)。
  3. 自動化交互: 為非交互式命令(如 mysql, psql, ftp, sftp, telnet, expect 的替代)提供多行輸入。這是替代 expect 處理簡單交互的一種輕量級方法。
  4. 多行字符串變量: 在腳本中將 Heredoc 內容賦值給變量(var=$(cat <<EOF ... EOF))。
  5. 嵌入 SQL/代碼片段: 在 Shell 腳本中清晰、安全地嵌入 SQL 查詢、Python 片段、JSON 數據等。
  6. 創建臨時文件內容: 無需創建物理臨時文件即可為需要文件輸入的命令提供數據。

重要注意事項:

  • 結束標記的純潔性: 結束標記行(DELIMITER)必須是該行的唯一內容,前后絕對不允許有任何空格(包括行首和行尾的空格、制表符)。這是最常見的錯誤來源。
  • 變量作用域: Here Document 中的變量替換發生在生成 Here Document 文本塊時(在命令執行前),使用的是當前 Shell 環境中的變量值。
  • 命令替換時機: 命令替換(`...`$(...))也是在 Here Document 文本塊生成時執行。
  • 性能: 對于非常大的文本塊,Heredoc 可能不如處理真實文件高效,但對于腳本中常見的中小型輸入塊來說,這不是問題。
  • 與 Here String (<<<) 的區別: Here String (<<< "single line string") 用于將單行字符串重定向到命令的標準輸入。Here Document (<<) 用于處理多行文本塊

總結:

<< EOF (Here Document) 是 Linux Shell 腳本中處理多行輸入的極其強大和靈活的工具。理解其基本語法(尤其是結束標記的嚴格性)、引號對變量/命令替換的影響以及 <<- 對縮進的支持,對于編寫清晰、健壯且易于維護的腳本至關重要。它在生成文件、自動化命令交互和嵌入代碼片段等場景中應用廣泛。










Linux Here Document (<< EOF) 詳解

Here Document 是 Linux shell 腳本中一種特殊的重定向方式,允許你將多行輸入傳遞給命令。它使用 << 后跟一個定界符(通常是 EOF,但可以是任意字符串)來標識輸入的開始和結束。

基本語法

command << EOF
多行文本內容...
EOF

工作原理

  1. 當 shell 遇到 << DELIMITER 時,它會讀取后續輸入直到遇到僅包含 DELIMITER 的行
  2. 所有在這之間的內容(包括換行符)都會作為標準輸入傳遞給 command
  3. 定界符 EOF 可以是任意字符串,不一定是 “EOF”

常見用途

???? 1. 多行文本輸入

cat << EOF
這是第一行
這是第二行
這是第三行
EOF

???? 2. 交互式命令的非交互使用

ftp -n << EOF
open hostname
user username password
cd /remote/directory
put localfile
quit
EOF

???? 3. 變量替換

默認情況下,Here Document 中的變量會被擴展:

name="World"
cat << EOF
Hello, $name!
Today is $(date).
EOF

???? 4. 禁止變量替換

如果不想變量被擴展,可以使用單引號或反斜杠:

cat << 'EOF'
變量不會被擴展: $PATH
EOF# 或者
cat << \EOF
變量也不會被擴展: $HOME
EOF

變體:Here String

Here String 是 Here Document 的簡化版本,使用 <<<

command <<< "單行字符串輸入"

示例:

bc <<< "5 + 3 * 2"

高級用法

???? 1. 去除前導制表符

使用 <<- 可以刪除每行前面的制表符(不是空格):

cat <<- EOF這一行前面的制表符會被刪除這一行也是EOF

???? 2. 嵌套 Here Document

outer_command << OUTER
外層文本
$(inner_command << INNER
內層文本
INNER
)
OUTER

注意事項

  1. 定界符必須單獨一行,且前面不能有空格(除非使用 <<-
  2. 定界符可以是任意字符串,但通常使用 EOF
  3. 在 Here Document 結束標記(如 EOF)后不能有任何字符(包括空格)

實際應用示例

???? 創建配置文件

cat > config.conf << EOF
# 自動生成的配置文件
server_ip = 192.168.1.1
port = 8080
timeout = 30
EOF

???? 多行 SQL 查詢

mysql -u user -p database << EOF
SELECT * FROM users
WHERE active = 1
ORDER BY name;
EOF

Here Document 是 shell 腳本中非常強大的功能,特別適合需要傳遞多行輸入或模擬交互式會話的場景。










在Linux的Shell腳本編程中,<< 符號用于定義Here Document(也稱為Here-document、Here文稿),它允許你將多行文本或命令輸入到一個命令或程序中,而不需要使用多個echo語句或者臨時文件。這種機制特別適用于需要向命令提供多行輸入的情況。

基本語法如下:

command << DELIMITERHere Document content
DELIMITER
  • command 是接收輸入的命令。
  • DELIMITER 是界定符,可以是任何字符串,比如 EOFEND 等等。通常使用 EOF (End Of File) 作為慣例,但不是強制的。選擇的界定符必須單獨一行,并且不能有額外的空格或其他字符。

???? 使用示例

假設你想通過一個腳本一次性創建一個文件并寫入多行內容,你可以這樣做:

cat << EOF > myfile.txt
This is line one.
This is line two.
This is line three.
EOF

這會創建一個名為 myfile.txt 的文件,并將指定的三行文本寫入該文件。

???? 特殊用法

  1. 去除縮進:如果你希望Here Document的內容保持一定的縮進以增加代碼的可讀性,但是又不希望這些縮進出現在實際輸出中,可以在 << 后面加上 - (減號)。例如:

    cat <<- EOF > myfile.txtThis is line one.This is line two.
    EOF
    

    這樣,前導的Tab字符會被忽略。注意,這里只能使用Tab而不是空格進行縮進。

  2. 變量替換:默認情況下,在Here Document中的變量會被展開。如果你想禁止變量替換,可以使用單引號包裹定界符,如 'EOF'

  3. 傳遞輸入給命令:除了 cat 命令,Here Documents還可以與很多其他命令一起使用,如 ftpmailssh 等,用于提供交互式輸入。

Here Document是一個非常強大的工具,特別是在編寫自動化腳本時,它可以讓你更方便地處理和傳遞多行輸入。










在Linux Shell腳本中,<< EOF(稱為Here-DocumentHere-Docs)是一種輸入多行文本的語法。它允許直接在腳本中嵌入文本塊,并將其傳遞給命令的標準輸入。以下是詳細解析:


???? 1. 基礎語法

命令 << 結束標記
文本內容
結束標記
  • 結束標記:可以是任意字符串(常用EOFEND),需獨立成行且頂格書寫。
  • 作用:將<< 結束標記到下一個獨立行結束標記之間的內容作為輸入傳遞給命令。

???????? 示例:

cat << EOF
Hello, World!
This is a Here-Document.
EOF

輸出:

Hello, World!
This is a Here-Document.

???? 2. 格式處理
???????? 忽略縮進(使用<<-
<<- 代替 <<,可忽略文本塊前的制表符(Tab)(注意不支持空格):

cat <<- EOFIndented line (with Tabs)
EOF

輸出:

Indented line (with Tabs)

???? 3. 變量替換

  • 默認啟用變量替換:文本中的變量會被解析。
  • 禁用變量替換:將結束標記用單引號包裹(<<'EOF'),此時內容按原樣輸出。

???????? 示例:

name="Alice"
cat << EOF
Hello, $name
EOF
# 輸出:Hello, Alicecat << 'EOF'
Hello, $name
EOF
# 輸出:Hello, $name

???? 4. 常用場景
???????? 生成配置文件

cat > /etc/myapp.conf << EOF
server_ip=192.168.1.1
port=8080
EOF

???????? 執行交互式命令

# 通過輸入用戶名和密碼自動登錄數據庫
mysql -u root -p << EOF
password123
SELECT * FROM users;
EOF

???????? 嵌入代碼塊

# 將多行代碼傳遞給解釋器(如Python)
python3 << EOF
print("Hello from Python")
EOF

???? 5. 注意事項

  1. 結束標記必須頂格,前后不能有空格或其他字符。
  2. 若文本中包含$\等特殊符號,需根據需求決定是否用轉義或單引號包裹結束標記。
  3. 重定向符號優先級<<應在命令末尾,如cat << EOF > file.txt是錯誤的,正確寫法:
    cat << EOF > output.txt
    Content here
    EOF
    

???? 6. 擴展:Here-String (<<<)
類似Here-Doc,但直接處理單行字符串:

grep "hello" <<< "hello world"
# 等同于 echo "hello world" | grep "hello"

???? 總結
Here-Document在腳本中處理多行輸入時非常高效,尤其適用于生成文件、交互式命令或嵌入代碼塊。掌握變量替換規則和縮進技巧是使用關鍵。










Here Document(<< EOF)是 Linux Shell 中的一種多行文本輸入重定向機制,允許直接將文本塊傳遞給命令,無需臨時文件。其核心原理是通過自定義分隔符(如 EOF)標記文本起止位置,中間內容作為命令的標準輸入。以下詳解其語法、特性和應用場景:


???? 📜 一、基本語法與工作原理

  1. 語法結構

    命令 << 分隔符
    文本內容
    分隔符
    
    • 分隔符:任意字符串(常用 EOFEND),結束標記需單獨成行且無前后空格
    • 示例
      cat << EOF
      第一行
      第二行
      EOF
      
      輸出兩行文本。
  2. 工作原理

    • << 操作符指示 Shell 從后續行讀取輸入,直到遇到頂格寫且無空格的分隔符
    • 文本內容會按原樣傳遞給命令的標準輸入(stdin)。

???? 🔧 二、變量處理與引號控制

  1. 變量擴展(無引號分隔符)
    文本中的變量和命令會被解析并替換:

    name="Alice"
    cat << EOF
    Hello $name
    Today is $(date)
    EOF
    

    輸出Hello Alice + 當前日期。

  2. 禁用變量擴展(引號包裹分隔符)
    使用單引號 'EOF' 時,文本內容原樣輸出:

    cat << 'EOF'
    Hello $name   # 輸出 Hello $name
    EOF
    

    適用于保留 $() 等特殊字符。


???? ?? 三、縮進處理(<<-
使用 <<- 可忽略行首的 Tab 制表符(?? 不忽略空格),便于代碼縮進:

cat <<- EOFThis line has a leading Tab (ignored).
EOF  # 結束標記可用 Tab 縮進

注意:僅 Tab 有效,空格會導致結束標記識別失敗。


???? 🛠? 四、常見應用場景

  1. 生成配置文件
    動態創建 Nginx 配置:

    cat > /etc/nginx/conf.d/app.conf << EOF
    server {listen 80;server_name example.com;root /var/www/html;
    }
    EOF
    

    > 覆蓋文件,>> 追加內容。

  2. 自動化交互命令
    自動登錄 FTP 并下載文件:

    ftp -n << EOF
    open ftp.example.com
    user username password
    binary
    get file.tar.gz
    quit
    EOF
    

    適用于 ftpmysqlpasswd 等需多步交互的命令。

  3. 多行注釋
    :(空命令)忽略文本塊:

    : << 'COMMENT'echo "此代碼不會執行"ls -l
    COMMENT
    

    單引號確保內部變量不被展開。

  4. 變量賦值與管道操作

    • 賦值給變量
      content=$(cat << EOF
      Multiline text
      EOF
      )
      
    • 結合管道處理
      cat << 'EOF' | sed 's/foo/bar/g'
      foo line
      EOF
      
      輸出 bar line

???? ?? 五、注意事項與高級技巧

  1. 嵌套 Here Document
    外層用引號包裹分隔符(如 'EOF1')可禁用內層解析,否則需轉義內層分隔符:

    cat << 'EOF1'
    Outer text
    $(cat << EOF2  # 內層被當作純文本輸出
    Inner text
    EOF2
    )
    EOF1
    

  2. SSH 遠程執行
    遠程變量需轉義避免本地解析:

    ssh user@host << EOF
    echo "Local: $PWD"        # 本地解析
    echo "Remote: \$PWD"      # 遠程解析
    EOF
    

  3. 錯誤排查

    • 結束標記未頂格 → 報錯 unexpected EOF
    • 文本含分隔符 → 更換分隔符(如 EOF_SPECIAL)。

???? 💎 六、總結

  • 核心價值:簡化多行文本輸入,提升腳本可讀性與可維護性。
  • 最佳實踐
    • 動態內容 → 無引號分隔符(啟用變量擴展)。
    • 靜態內容 → 引號包裹分隔符(避免意外解析)。
    • 縮進優化 → <<- + Tab(非空格)。

附:Here Document 在 Shell 腳本中的使用場景分布

  • 配置文件生成(35%)
  • SQL 查詢(25%)
  • 臨時文件操作(20%)
  • 自動化交互(15%)
  • 其他(5%)

通過合理應用 Here Document,可高效解決腳本中的多行輸入需求,減少臨時文件依賴。










📚 Here Document (<< EOF) 詳解

Here Document 是 Linux Shell 中的一種特殊重定向方式,用于將多行文本直接傳遞給命令作為標準輸入,避免依賴臨時文件或手動輸入。以下是核心知識點和應用場景:


???? 🔍 一、基本語法與原理

命令 << 定界符多行文本內容...
定界符
  • 定界符(Delimiter):任意字符串(如 EOFEND),用于標記文本起止。
  • 規則
    • 結束定界符必須頂格書寫,前后無空格或字符。
    • 開頭的定界符前后空格會被忽略。
  • 原理
    << 操作符指示 Shell 從后續行讀取輸入,直到遇到獨立的結束定界符,期間所有內容作為命令的標準輸入。

???? ?? 二、核心特性與變體

  1. 變量與命令擴展控制

    • 默認擴展(無引號):
      cat << EOF
      當前路徑: $PWD
      時間: $(date)
      EOF
      
      輸出變量和命令結果(如 /home/user 和當前時間)。
    • 禁用擴展(引號定界符):
      cat << 'EOF'
      內容: $PWD 不會被替換
      EOF
      
      直接輸出 $PWD$(date)
  2. 忽略制表符(<<-
    使用 <<- 可忽略行首的 Tab 縮進(不忽略空格),便于代碼格式化:

    cat <<- EOF縮進的內容(Tab會被刪除)EOF  # 可用 Tab 縮進
    
  3. 輸出重定向
    將內容寫入文件而非屏幕:

    cat << EOF > config.txt  # 覆蓋寫入
    server {port 80;
    }
    EOF
    

    或追加寫入(>>)。


???? 💡 三、典型應用場景

  1. 生成配置文件

    cat > nginx.conf << EOF
    server {listen 80;root /var/www;
    }
    EOF
    

    快速生成結構化配置,支持變量動態替換(如 root $WEB_ROOT)。

  2. 自動化交互命令

    • 修改密碼(免交互):
      passwd user << EOF
      new_password
      new_password
      EOF
      
    • 數據庫操作
      mysql -u root << EOF
      CREATE DATABASE app_db;
      GRANT ALL ON app_db.* TO 'user'@'localhost';
      EOF
      
  3. 多行文本處理

    • 統計行數:wc -l << EOF ... EOF
    • 變量賦值:
      read message << EOF
      Hello, $USER!
      EOF
      
  4. 遠程命令執行(SSH)

    ssh user@host << 'EOF'  # 引號避免本地變量擴展
    echo "Remote path: \$PWD"
    EOF
    

    需轉義遠程變量(如 \$PWD)防止本地解析。


???? ?? 四、注意事項

  1. 定界符沖突:確保內容中不包含獨立的定界符,否則會提前終止輸入。
  2. 空格敏感:結束定界符必須無前置空格,否則會被視為普通文本。
  3. 性能考量:大文本塊(如數 MB)建議使用臨時文件,避免腳本臃腫。

???? 🔄 五、補充:Here String (<<<)
用于傳遞單行文本,更簡潔:

tr a-z A-Z <<< "hello"  # 輸出 "HELLO"

支持變量擴展,但不適合多行內容。


???? ? FAQ

  • Q:定界符是否必須用 EOF
    A:可使用任意字符串(如 END),但需確保唯一性。
  • Q:Here Document 與管道的區別?
    A:管道傳遞命令輸出(cmd1 | cmd2),而 Here Document 直接傳遞靜態文本塊。
  • Q:如何縮進內容但不包含 Tab?
    A:用空格縮進 + <<- 無法生效,需保持無縮進或改用變量存儲文本。

掌握 Here Document 能顯著提升 Shell 腳本的靈活性與可讀性,尤其適用于需動態生成多行輸入的場景。










在Linux shell腳本中,<< EOF(Here-Document, heredoc)是一種便捷的輸入重定向方式,允許將多行文本直接嵌入腳本中,作為命令的輸入。它尤其適合需要批量輸入文本、生成配置文件或編寫復雜腳本的場景。以下是其詳細解析:

???? 一、基本語法

命令 << 分界符多行文本內容
分界符
  • <<:重定向符號,指示后續內容為“Here-Document”。
  • 分界符:自定義標記(通常用EOF,也可用其他字符串如ENDMARK等),用于標識文本的開始和結束。
  • 多行文本:位于兩個分界符之間的內容,會被作為標準輸入傳遞給前面的命令。

???? 二、核心特點

  1. 文本原樣傳遞
    除特殊符號(如$\ )外,文本內容會原樣輸出,無需手動轉義換行符。
    示例:

    cat << EOF
    這是第一行
    這是第二行
    包含空格  和\t制表符
    EOF
    

    輸出:

    這是第一行
    這是第二行
    包含空格  和	制表符
    
  2. 變量和命令替換
    默認情況下,文本中的變量(如$VAR)和命令(如$(命令))會被解析執行。
    示例:

    NAME="Linux"
    cat << EOF
    系統名稱:$NAME
    當前時間:$(date +%H:%M)
    EOF
    

    輸出(假設當前時間為15:30):

    系統名稱:Linux
    當前時間:15:30
    
  3. 禁止替換的方法
    若希望文本中的變量和命令不被解析,可將分界符用單引號包裹('EOF'),或對特殊字符加轉義符\
    示例:

    NAME="Linux"
    cat << 'EOF'  # 分界符加單引號,禁止替換
    系統名稱:$NAME
    當前時間:$(date)
    EOF
    

    輸出:

    系統名稱:$NAME
    當前時間:$(date)
    

???? 三、常見用法

  1. 生成配置文件
    直接在腳本中寫入配置內容,避免單獨創建文件。
    示例(生成Nginx配置):

    cat << EOF > /etc/nginx/conf.d/my site.conf
    server {listen 80;server_name example.com;root /var/www/html;
    }
    EOF
    
  2. 批量輸入到交互式命令
    為需要手動輸入的命令(如mysqlftp)自動傳遞參數。
    示例(MySQL創建數據庫):

    mysql -u root -p"123456" << EOF
    CREATE DATABASE IF NOT EXISTS mydb;
    USE mydb;
    CREATE TABLE users (id INT, name VARCHAR(20));
    EOF
    
  3. 腳本內嵌入幫助信息
    結合echocat輸出程序說明。
    示例:

    help() {cat << EOF
    用法:script.sh [選項]
    選項:-h  顯示幫助-v  顯示版本
    EOF
    }
    help  # 調用函數輸出幫助信息
    

???? 四、高級技巧

  1. 忽略行首制表符(-參數)
    在分界符前加-,可忽略文本中以制表符(Tab)開頭的字符,使腳本更整潔。
    示例:

    cat <<- EOF  # 注意分界符前的“-”這行開頭是Tab,會被忽略這行開頭是空格,不會被忽略
    EOF
    

    輸出:

    這行開頭是Tab,會被忽略這行開頭是空格,不會被忽略
    
  2. 嵌套使用Here-Document
    分界符可以不同,實現多層嵌套(需注意縮進和標記匹配)。
    示例:

    cat << OUTER
    外層文本
    $(cat << INNER
    內層文本:$(date)
    INNER
    )
    外層結束
    OUTER
    

    輸出:

    外層文本
    內層文本:2025年 07月22日 星期二 15:30:00 CST
    外層結束
    
  3. 與管道結合
    將Here-Document的輸出通過管道傳遞給其他命令處理。
    示例(統計行數):

    cat << EOF | wc -l
    行1
    行2
    行3
    EOF
    

    輸出:3

???? 五、注意事項

  1. 分界符必須獨立成行
    結束分界符必須單獨占一行,且前后不能有任何字符(包括空格),否則會被視為普通文本。
    ? 錯誤示例(分界符前有空格):

    cat << EOF
    文本內容EOF  # 前面有空格,會被當作文本的一部分
    
  2. 分界符大小寫敏感
    EOFeof是不同的標記,需嚴格匹配。

  3. 避免特殊字符沖突
    若文本中包含分界符(如EOF),需更換分界符(如用MY_EOF),否則會提前結束輸入。

???? 六、與Here-String的區別
Here-Document的簡化版是Here-String(<<<,用于單行文本:

echo "Hello" | grep "ell"  # 等價于
grep "ell" <<< "Hello"
  • Here-Document適合多行文本,Here-String適合單行,按需選擇即可。

通過靈活使用Here-Document,可以大幅簡化腳本中處理多行文本的邏輯,提高腳本的可讀性和維護性,是Linux shell編程中的重要工具。










在Linux的Shell腳本編程中,<< 符號用于定義Here Document(也稱為Here-document、Here文稿),它允許你將多行文本或命令輸入到一個命令或程序中,而不需要使用多個echo語句或者臨時文件。這種機制特別適用于需要向命令提供多行輸入的情況。

基本語法如下:

command << DELIMITERHere Document content
DELIMITER
  • command 是接收輸入的命令。
  • DELIMITER 是界定符,可以是任何字符串,比如 EOFEND 等等。通常使用 EOF (End Of File) 作為慣例,但不是強制的。選擇的界定符必須單獨一行,并且不能有額外的空格或其他字符。

???? 使用示例

假設你想通過一個腳本一次性創建一個文件并寫入多行內容,你可以這樣做:

cat << EOF > myfile.txt
This is line one.
This is line two.
This is line three.
EOF

這會創建一個名為 myfile.txt 的文件,并將指定的三行文本寫入該文件。

???? 特殊用法

  1. 去除縮進:如果你希望Here Document的內容保持一定的縮進以增加代碼的可讀性,但是又不希望這些縮進出現在實際輸出中,可以在 << 后面加上 - (減號)。例如:

    cat <<- EOF > myfile.txtThis is line one.This is line two.
    EOF
    

    這樣,前導的Tab字符會被忽略。注意,這里只能使用Tab而不是空格進行縮進。

  2. 變量替換:默認情況下,在Here Document中的變量會被展開。如果你想禁止變量替換,可以使用單引號包裹定界符,如 'EOF'

  3. 傳遞輸入給命令:除了 cat 命令,Here Documents還可以與很多其他命令一起使用,如 ftpmailssh 等,用于提供交互式輸入。

Here Document是一個非常強大的工具,特別是在編寫自動化腳本時,它可以讓你更方便地處理和傳遞多行輸入。










在 Linux 的 Shell 腳本編程中,<< 操作符用于定義 Here Document(也稱為 Here 文檔、Here 文稿),它允許將多行文本直接作為輸入傳遞給命令或程序。Here Document 的核心是通過一個特定的結束標記(如 EOF)來界定輸入的起始和結束。以下是關于 << EOF 的詳細解析:


???? 1. Here Document 的基本語法

command << DELIMITER
... 多行文本內容 ...
DELIMITER
  • command:接收輸入的命令(如 catgrepmysql 等)。
  • <<:Here Document 的起始操作符。
  • DELIMITER:結束標記(通常使用 EOF,但也可以自定義為其他字符串,如 END)。
  • ... 多行文本內容 ...:需要傳遞給命令的多行文本。
  • 結束標記規則
    • 結束標記必須單獨一行
    • 前后不能有空格、Tab 或其他字符(否則會被視為文本的一部分)。
    • 開始標記(<<DELIMITER)前后的空格會被忽略。

???? 2. Here Document 的典型用途
???????? (1) 將多行文本傳遞給 cat 命令

cat << EOF
這是第一行。
這是第二行。
EOF
  • 輸出:
    這是第一行。
    這是第二行。
    

???????? (2) 將多行文本寫入文件

cat << EOF > myfile.txt
第一行內容
第二行內容
第三行內容
EOF
  • 會生成 myfile.txt 文件,并寫入三行文本。

???????? (3) 向交互式命令傳遞輸入
例如,向 ftpmysql 傳遞多行命令:

mysql -u user -p password << EOF
USE mydatabase;
SELECT * FROM mytable;
EOF

???????? (4) 動態生成配置文件

USERNAME="admin"
cat << EOF > config.yml
username: $USERNAME
port: 8080
EOF
  • 輸出的 config.yml 內容:
    username: admin
    port: 8080
    

???? 3. Here Document 的高級用法
???????? (1) 控制變量替換

  • 默認行為:Here Document 中的變量會被 Shell 展開。

    NAME="Alice"
    cat << EOF
    Hello, $NAME!
    EOF
    

    輸出:

    Hello, Alice!
    
  • 禁用變量替換:在 << 后使用單引號包裹結束標記(<<'EOF')。

    NAME="Alice"
    cat <<'EOF'
    Hello, $NAME!
    EOF
    

    輸出:

    Hello, $NAME!
    

???????? (2) 忽略縮進(<<-DELIMITER
如果需要保留文本中的縮進,但希望 Shell 忽略前導的 Tab(僅支持 Tab,空格無效),可以使用 <<-DELIMITER

cat <<-EOF這是第一行,使用 Tab 縮進。這是第二行,同樣使用 Tab 縮進。
EOF
  • 輸出:
    這是第一行,使用 Tab 縮進。
    這是第二行,同樣使用 Tab 縮進。
    

???????? (3) 結合命令替換
在 Here Document 中嵌入命令輸出:

cat << EOF
當前時間是:$(date +"%Y-%m-%d")
當前用戶是:$(whoami)
EOF
  • 輸出示例:
    當前時間是:2025-07-22
    當前用戶是:user
    

???? 4. Here Document 的常見錯誤與解決方案
???????? (1) 結束標記未頂格寫

cat << EOF
這是第一行。EOF  # 錯誤:結束標記前有空格
  • 修復:確保結束標記單獨一行且無空格或縮進。

???????? (2) 變量提前展開
如果希望保留變量未展開的狀態,需使用單引號:

VAR="test"
cat << EOF
$VAR  # 變量會被展開為 "test"
EOF
  • 禁用展開
    cat <<'EOF'
    $VAR  # 變量不會被展開
    EOF
    

???????? (3) 結束標記與其他內容沖突
確保結束標記是唯一的,避免與文本中的其他內容重復:

cat << EOF
EOF  # 錯誤:文本中包含與結束標記相同的內容
  • 修復:選擇一個獨特的結束標記,如 MY_EOF

???? 5. Here Document 的實際應用場景
???????? (1) 自動生成配置文件

cat << EOF > /etc/nginx/sites-available/example.conf
server {listen 80;server_name example.com;location / {root /var/www/html;index index.html;}
}
EOF

???????? (2) 與 SSH 結合遠程執行命令

ssh user@remote_host << 'EOF'
echo "Hello from remote host!"
mkdir -p /tmp/test
EOF

???????? (3) 執行多行 SQL 語句

mysql -u root -p << EOF
CREATE DATABASE mydb;
USE mydb;
CREATE TABLE users (id INT, name VARCHAR(20));
EOF

???? 6. Here Document 與輸入重定向的區別

特性Here Document (<< EOF)輸入重定向 (< file)
輸入來源內聯多行文本外部文件
動態內容生成支持變量替換、命令嵌套不支持動態內容
適用場景交互式命令、腳本中的多行輸入讀取靜態文件內容
示例cat << EOF ... EOFcat < input.txt

???? 7. 總結

  • Here Document 是 Shell 腳本中處理多行輸入的強大工具。
  • 它通過 << 和結束標記(如 EOF)界定輸入范圍,支持變量替換、縮進控制等高級功能。
  • 使用時需注意結束標記的格式(必須頂格、無空格),并合理選擇是否啟用變量替換。
  • 適用于生成配置文件、與交互式程序通信、動態生成多行文本等場景。

通過熟練掌握 Here Document,可以顯著提升 Shell 腳本的靈活性和可讀性。










Linux中的 << EOF(Here Document)是一種在Shell腳本中處理多行文本輸入的強大工具。以下是對其核心概念、用法和注意事項的詳細解析:


???? 一、基本語法

command << EOF
多行文本內容
EOF
  • 作用:將兩個 EOF 之間的文本作為 command 的標準輸入。
  • EOF:可自定義為任意標識符(如 ENDDELIMITER),需保證首尾一致。

???? 二、核心特性
???????? 1. 變量與命令替換

  • 默認行為:文本中的 $VAR$(command) 會被解析。

    name="World"
    cat << EOF
    Hello $name    # 輸出 Hello World
    Today is $(date)
    EOF
    
  • 禁用替換:用單引號包裹分隔符 <<'EOF'

    cat <<'EOF'
    $PATH 不會被解析
    EOF
    

???????? 2. 縮進處理

  • <<- 的作用:忽略文本行的前導 Tab(非空格)。
    cat <<-EOFThis line is indented with tabs.EOF  # 實際輸出無縮進
    

???? 三、典型應用場景
???????? 1. 多行文本生成

cat << EOF > config.txt
server {host = 127.0.0.1port = 8080
}
EOF

???????? 2. 交互式命令輸入

ftp -n << EOF
open example.com
user user pass
binary
get file.txt
quit
EOF

???????? 3. 遠程執行命令(SSH)

ssh user@host << EOFsudo apt updatesudo apt upgrade -y
EOF

???? 四、高級技巧
???????? 1. 嵌套Here Document

cat << OUTER
Outer text
$(cat << INNER
Inner text
INNER)
OUTER

???????? 2. 動態分隔符

delimiter="CUSTOM_END"
cat << $delimiter
Dynamic delimiter example
$delimiter

???? 五、注意事項

  1. 特殊字符處理:若文本包含 $`\,需通過轉義或禁用替換處理。
  2. 避免意外終止:確保分隔符(如 EOF)不出現在文本內容中。
  3. 性能問題:超大文本建議使用臨時文件替代。

???? 六、與 Here String 的區別

  • <<:多行輸入(Here Document)
  • <<<:單行輸入(Here String)
    # 等效于 echo "Hello" | grep "H"
    grep "H" <<< "Hello"
    

通過靈活運用 << EOF,可顯著提升Shell腳本處理復雜輸入的能力。建議結合 man bashinfo bash 深入學習高級用法。










在 Linux 中,<< EOF 是 Here Document(“此處文檔”)的典型用法,用于向命令傳遞多行輸入。Here Document 通過將多行文本直接嵌入腳本或命令行中,避免了使用臨時文件或多次 echo 的繁瑣操作。以下是關于 Here Document 的詳細解析:


???? 1. 基本概念
Here Document(“此處文檔”)是一種通過輸入重定向將多行文本傳遞給命令的方式。它使用一個特殊標記(如 EOF)來標識輸入的起始和結束,中間的內容被視為命令的輸入。

  • EOF:End of File 的縮寫,只是一個占位符,可以自定義為其他字符串(如 ENDTEXT 等)。
  • 作用:允許在命令行或腳本中直接嵌入多行文本,無需依賴外部文件或變量。

???? 2. 語法結構
Here Document 的基本語法如下:

command << delimiter
文檔內容
delimiter
  • command:需要接收多行輸入的命令(如 catmysql 等)。
  • delimiter:分隔符(通常為 EOF),用于標記輸入的開始和結束。
  • 文檔內容:多行文本內容,會被傳遞給 command 作為輸入。
  • 規則
    • 分隔符必須單獨成行,且頂格書寫(不能有前導空格或縮進)。
    • 如果希望忽略每行前的縮進,可以使用 <<- delimiter(注意 - 的位置)。

???? 3. 常見用例
???????? 3.1 創建多行文本文件
通過 cat 命令將多行文本保存到文件:

cat << EOF > example.txt
This is line 1.
This is line 2.
This is line 3.
EOF

運行后,example.txt 的內容為:

This is line 1.
This is line 2.
This is line 3.

???????? 3.2 執行多行命令
在 Shell 腳本中執行多行命令(例如向數據庫插入數據):

mysql -u root -p << EOF
CREATE DATABASE testdb;
USE testdb;
CREATE TABLE users (id INT, name VARCHAR(20));
EOF

???????? 3.3 傳遞多行輸入到命令
將多行文本傳遞給 grepawk 等命令:

grep "error" << EOF
This is an error message.
This line is normal.
Another error occurred here.
EOF

???????? 3.4 動態生成內容(變量替換)
Here Document 默認支持變量替換(類似雙引號):

name="Alice"
cat << EOF
Hello, $name!
Today is $(date).
EOF

輸出:

Hello, Alice!
Today is Mon Jul 22 04:32:17 UTC 2025

???????? 3.5 禁用變量替換
如果希望保留變量或命令的原始形式,可以用單引號包裹分隔符:

name="Alice"
cat << 'EOF'
Hello, $name!
Today is $(date).
EOF

輸出:

Hello, $name!
Today is $(date).

???? 4. 高級技巧
???????? 4.1 忽略縮進(<<-)
當需要對齊代碼時,可以使用 <<- 忽略每行前的 TAB 縮進:

cat <<- EOFThis line is indented with a TAB.But the indentation is ignored.
EOF

???????? 4.2 多行注釋
利用空命令 : 和 Here Document 實現多行注釋:

: << EOF
This is a comment block.
It will be ignored by the shell.
EOF

???????? 4.3 嵌套 Here Document
在 Here Document 內部嵌套另一個 Here Document(需使用不同的分隔符):

cat << OUTER
This is the outer document.
$(cat << INNER
This is the inner document.
INNER)
OUTER

???? 5. 常見錯誤及解決方案
???????? 5.1 分隔符未閉合
錯誤

cat << EOF
This line is missing the closing EOF.

解決:確保在輸入末尾添加分隔符 EOF

???????? 5.2 分隔符縮進問題
錯誤

cat << EOFThis line has leading spaces.EOF  # 錯誤!分隔符必須頂格

解決:將分隔符 EOF 頂格書寫,或使用 <<- EOF

???????? 5.3 分隔符被誤用
錯誤

cat << EOF
This is a line.
EOF
Another line after EOF.  # 錯誤!EOF 后的內容不會被處理

解決:確保分隔符 EOF 單獨成行,并且之后沒有多余內容。


???? 6. Here Document 與普通重定向的區別

特性Here Document (<< EOF)普通重定向 (< file)
輸入來源直接嵌入腳本中的多行文本從外部文件讀取輸入
靈活性可動態生成內容(支持變量替換)輸入內容固定
適用場景腳本中傳遞多行命令或配置命令需要從文件讀取輸入

???? 7. 總結
Here Document 是 Linux Shell 編程中非常強大的工具,適用于以下場景:

  • 生成配置文件或腳本。
  • 向命令傳遞多行輸入(如 SQL、YAML 等)。
  • 動態生成內容并結合變量替換。

通過靈活使用 << EOF,可以顯著簡化腳本編寫,提高代碼的可讀性和效率。










在Linux中,<< EOF(Here Document,中文常譯為“嵌入文檔”)是一種輸入重定向技術,用于在命令行或腳本中直接嵌入多行文本作為命令的輸入,無需依賴外部文件。它的核心作用是簡化“向命令提供多行輸入”的場景,尤其在腳本編寫中非常實用。

???? 基本語法
Here Document的通用格式如下:

命令 << 分界符多行輸入內容...
分界符
  • 命令:需要接收多行輸入的命令(如catsshsedmysql等)。
  • 分界符:標識輸入開始和結束的標記(最常用EOF,也可自定義為任意字符串,如ENDMARK等)。
  • 多行內容:要傳遞給命令的具體輸入,可包含文本、變量、命令替換等。

???? 核心規則

  1. 分界符的一致性:開始和結束的分界符必須完全相同(區分大小寫)。
    例:<< EOF 必須用 EOF 結束,不能用 eofEnd

  2. 結束分界符的位置:結束的分界符必須單獨占據一行,且是該行的第一個字符(不能有空格、Tab等前置字符),否則會被視為普通內容。
    錯誤示例(結束符前有空格):

    cat << EOF
    HelloEOF  # 前有空格,不會被識別為結束符
    EOF  # 正確的結束符
    

    輸出會包含 Hello EOF

  3. 變量與命令替換
    若分界符不加引號(如<< EOF),輸入內容中的變量($var)或命令替換($(cmd))會被自動解析為實際值。
    若分界符加引號(如<< 'EOF'<< "EOF"),則變量和命令替換會被原樣保留,不解析。

    示例:

    name="Alice"
    # 分界符不加引號:解析變量和命令
    cat << EOF
    Name: $name
    Date: $(date +%F)
    EOF# 分界符加引號:不解析,原樣輸出
    cat << 'EOF'
    Name: $name
    Date: $(date +%F)
    EOF
    

    輸出分別為:

    Name: Alice
    Date: 2025-07-22  # 實際日期
    

    Name: $name
    Date: $(date +%F)
    
  4. 忽略前導Tab:<<- 語法
    若用 <<-分界符(注意 -),則輸入內容中以 Tab鍵 開頭的字符會被自動忽略(空格不生效),適合腳本中通過縮進優化代碼格式。

    示例:

    # 腳本中縮進更整潔
    if true; thencat <<-EOF這是第一行(前面的Tab會被忽略)這是第二行(前面的Tab會被忽略)EOF  # 結束符前的Tab也會被忽略(因用了<<-)
    fi
    

    輸出(無Tab):

    這是第一行(前面的Tab會被忽略)
    這是第二行(前面的Tab會被忽略)
    

???? 常見使用場景
Here Document的核心價值是“在代碼中嵌入多行輸入”,典型場景包括:

???????? 1. 快速創建包含多行內容的文件
無需手動編輯文件,直接通過cat結合Here Document生成:

# 創建test.txt,內容包含多行文本
cat << EOF > test.txt
Hello, Here Document!
這是第二行。
變量示例:當前用戶是 $USER
EOF

執行后,test.txt的內容為:

Hello, Here Document!
這是第二行。
變量示例:當前用戶是 root  # 假設當前用戶是root

???????? 2. 向交互式命令傳遞輸入
例如ssh遠程執行命令、mysql執行SQL語句等,避免手動輸入:

# 通過ssh遠程在服務器上創建目錄并輸出信息
ssh user@remote_host << EOF
mkdir -p /tmp/test
echo "目錄創建成功:$(date)"
EOF

???????? 3. 腳本中嵌入配置文件內容
部署服務時,直接在腳本中寫入配置文件內容,無需依賴外部配置文件:

# 配置Nginx虛擬主機
cat << EOF > /etc/nginx/conf.d/my site.conf
server {listen 80;server_name example.com;root /var/www/html;index index.html;
}
EOF

???????? 4. 結合管道或重定向處理文本
通過管道將Here Document的內容傳遞給其他命令處理:

# 篩選包含"error"的行
<< EOF | grep "error"
info: start
warn: low memory
error: disk full
debug: end
EOF

輸出:error: disk full

???? 注意事項

  • 分界符可自定義(不一定是EOF),但建議用大寫字母(如END),避免與內容沖突。
  • 若輸入內容中需要包含分界符本身(如EOF),可通過轉義(\EOF)或更換分界符解決。
  • <<- 僅忽略Tab,不忽略空格,因此縮進時需用Tab而非空格。

???? 總結
Here Document(<< EOF)是Linux中簡化多行輸入的高效工具,通過靈活的分界符規則和變量解析能力,大幅提升了腳本編寫和命令行操作的效率,尤其適合需要動態生成多行內容的場景。










<< EOF(稱為 Here Document 或 Heredoc)是 Linux Shell 中一種用于多行輸入重定向的語法。它的核心作用是將一段文本塊(通常是多行內容)直接作為某個命令的輸入,而無需單獨創建文件。以下是詳細說明:


???? 1. 基礎語法

command << DELIMITER
文本內容...
DELIMITER
  • DELIMITER:自定義的結束標記(如 EOFEND 等),需要成對出現。
  • 文本內容:輸入給 command 的內容,直到遇到獨立的 DELIMITER 結束。

???????? 示例:

cat << EOF
Hello, World!
This is a Here Document example.
EOF

輸出:

Hello, World!
This is a Here Document example.

???? 2. 結束標記規則

  • 嚴格匹配:結束標記必須獨立成行,且前后不能有空格或其他字符。
  • 縮進問題(如 Bash 中):
    使用 <<- DELIMITER(注意短橫線 -)可忽略行首的 制表符(Tab),但空格仍會報錯。
    cat <<- EOFThis line has leading tabs (ignored).EOF  # 這里必須用 Tab 縮進,不能是空格
    

???? 3. 變量與命令替換

  • 變量替換:默認啟用(類似雙引號):
    name="Alice"
    cat << EOF
    Hello, $name!  # 輸出 "Hello, Alice!"
    EOF
    
  • 禁止替換:用單引號包裹 DELIMITER
    cat << 'EOF'
    Hello, $name!  # 輸出 "Hello, $name!"
    EOF
    
  • 命令替換
    cat << EOF
    Today is $(date).
    EOF
    

???? 4. 轉義字符處理

  • 默認不轉義(如 \n 作為普通字符),但可通過以下方式控制:
    • 使用雙引號包裹 DELIMITER(不改變行為,因為默認已啟用)。
    • 使用 -e 選項(如 echo -e)解釋轉義符。
    • 行首反斜杠 \ 可轉義換行符(合并行):
      cat << EOF
      Line 1 \
      continued on Line 2
      EOF
      
      輸出:Line 1 continued on Line 2

???? 5. 輸入目標

  • 標準輸入:通常傳遞給命令,如 catgrepssh 等。
  • 與管道結合
    cat << EOF | grep "Hello"
    Hello, World!
    Goodbye!
    EOF
    
    輸出:Hello, World!

???? 6. 應用場景
???????? 場景 1:生成文件/配置

cat > config.yaml << EOF
app:name: "myapp"port: 8080
EOF

???????? 場景 2:自動化交互命令

mysql -u root -p << EOF
CREATE DATABASE mydb;
GRANT ALL ON mydb.* TO 'user'@'localhost';
EOF

???????? 場景 3:腳本內多行輸出

usage() {cat << EOF
Usage: $0 [options]
Options:-h  Show help-v  Enable verbose mode
EOF
}

???? 7. 常見錯誤

  • 不匹配的結束標記
    cat << EOF
    Line 1
    E0F  # 拼寫錯誤,無法結束(應全大寫 EOF)
    EOF
    
  • 縮進不一致:使用 <<- 時只能用 Tab,不能用空格。

???? 8. 擴展:Here String (<<<)

  • 單行輸入command <<< "文本"
    grep "foo" <<< "foo bar baz"
    

???? 總結

  • 優勢:避免創建臨時文件,提升腳本可讀性。
  • 注意:確保結束標記唯一,合理處理變量替換與縮進。

掌握 Here Document 可大幅簡化多行輸入場景的腳本編寫!










Here Document(<< EOF)詳解

Here Document 是 Linux 中一種方便的輸入機制,允許你在腳本中一次性輸入多行數據,通常用于向命令或程序傳遞多行輸入。以下是其詳細說明:

???? 1. 基本語法

command << EOF
內容行1
內容行2
...
EOF
  • <<:表示開始 Here Document。
  • EOF:標記,表示輸入的結束。可以選擇其他名稱,如 END,但需前后一致。
  • 內容行:放置在標記之間的多行輸入。

???? 2. 使用場景

  • 寫入文件

    cat << EOF > file.txt
    第一行內容
    第二行內容
    EOF
    

    將內容寫入 file.txt

  • 作為命令輸入

    tr 'A-Z' 'a-z' << EOF
    HELLO WORLD
    EOF
    

    輸出 hello world

  • 腳本中使用

    #!/bin/bash
    echo "請輸入多行內容,以EOF結束:"
    content=$(cat << EOF
    $(date)
    $(whoami)
    EOF
    )
    echo "$content"
    

???? 3. 變量替換
默認情況下,Here Document 會進行變量替換。例如:

name="Alice"
cat << EOF
你好,$name!
EOF

輸出:

你好,Alice!

若要禁用變量替換,使用單引號:

cat << 'EOF'
你好,$name!
EOF

輸出:

你好,$name!

???? 4. 注意事項

  • 結束標記必須單獨一行,并且不能有前導空格。
  • 可以使用不同名稱的標記,如 END,但需前后一致。

???? 5. 示例

# 將多行內容寫入文件
echo "開始寫入文件..." 
cat << EOF > example.txt
這是一行內容。
這是第二行。
EOF
echo "內容已寫入 example.txt"# 輸出多行信息
echo "顯示信息:"
cat << INFO
歡迎來到這里!
這是一個示例。
INFO

???? 6. 總結
Here Document 提供了一種簡潔的方式來處理多行輸入,廣泛應用于腳本編寫中。通過合理的使用,可以顯著提高腳本的可讀性和效率。










Linux中的<< EOF(Here Document)是一種用于將多行文本傳遞給命令或腳本的輸入重定向方式,常用于Shell腳本中。以下是對其的詳細解析:

???? 一、基本概念

Here Document(簡稱Heredoc)允許將一段多行文本作為輸入傳遞給命令或腳本[1][2]。例如:

cat << EOF
This is line 1
This is line 2
EOF

輸出結果為:

This is line 1
This is line 2

???? 二、核心語法

  1. 基本結構

    command << delimiter
    [text]
    delimiter
    
    • command:接收輸入的命令(如catmailssh等)。
    • delimiter:自定義的結束標記(如EOF),需保證前后一致且獨占一行[1][2]。
    • text:要傳遞的多行內容,最終作為command的標準輸入。
  2. 示例

    # 將多行文本寫入文件
    cat << EOF > myfile.txt
    Hello World
    This is a test file.
    EOF
    

???? 三、關鍵特性與變形

  1. 分隔符規則

    • 結束分隔符必須頂格寫,前后不得有空格或Tab[1][2]。
    • 起始分隔符前的空格會被忽略,但建議保持簡潔。
  2. 變量解析

    • Heredoc內容支持Shell變量替換[1][3],例如:
      name="Alice"
      cat << EOF
      Hello $name!
      EOF
      
      輸出:Hello Alice!
    • 若需禁用變量解析,用引號包裹分隔符(推薦雙引號)[1][3]:
      cat << "EOF"
      Hello $name!
      EOF
      
      輸出:Hello $name!
  3. 縮進處理(<<-

    • 使用<<-代替<<時,Heredoc內容的每行開頭制表符(Tab)會被刪除,適合縮進代碼提升可讀性[1][5]:
      cat <<- EOF
      HelloWorld
      EOF
      
      輸出:
      Hello
      World
      

???? 四、常見應用場景

  1. 自動化交互命令

    • 通過Heredoc模擬交互式輸入,例如遠程執行SSH命令:
      ssh user@host <<EOF
      cd /path
      ls -l
      EOF
      
  2. 生成配置文件

    • 動態生成Docker或Kubernetes的配置文件:
      cat <<EOF | sudo tee /etc/docker.service
      [Unit]
      Description=Docker Service
      EOF
      
  3. 批量處理SQL或腳本

    • 將多條SQL語句傳遞給MySQL:
      mysql -u root <<EOF
      CREATE DATABASE test;
      USE test;
      CREATE TABLE users (id INT);
      EOF
      

???? 五、注意事項

  1. 終止符嚴格性

    • 結束分隔符必須獨占一行,且不能有額外字符(包括空格)[1][4]。
    • 示例錯誤寫法:
      cat << EOF  # 錯誤:EOF后有空格
      Content
      EOF
      
  2. 特殊字符轉義

    • 若內容包含$`等Shell元字符,需用引號禁用解析或手動轉義[4]。
  3. 兼容性

    • Heredoc在大多數類Unix系統(如Linux、macOS)的Shell中均支持,但具體語法可能因Shell類型(如Bash、Zsh)略有差異[5]。

???? 六、總結

Here Document(<< EOF)是Linux Shell中強大的文本輸入工具,適用于多行文本處理、自動化腳本、配置文件生成等場景。通過靈活使用分隔符、變量控制和縮進處理,可顯著提升腳本的可讀性與效率[1][3][5]。

































tee x << EOFcat > x << EOFcat << EOF > x 對比 筆記250709







tee x << EOFtee > x << EOFtee << EOF > xcat > x << EOFcat << EOF > x 對比 筆記250722







<< EOF<< ‘EOF‘<< “EOF“有無引號的區別多回答筆記250722







<< EOF<< \EOF<< ‘EOF‘<< “EOF“多講解筆記250722







Here-Document的<<<<-<<< 多解說筆記250722







Here-Document(EOF)與echo,printf多個比較筆記250723







比較Linux的Shell的 EOFechoprintf , 將文本輸出到文件







LinuxShell 的 Here-Document(<< EOF) 筆記250723

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/bicheng/90330.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/90330.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/90330.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Go語言實戰案例-簡單配置文件(INI格式)解析器

以下是《Go語言100個實戰案例》中的 文件與IO操作篇 - 案例20&#xff1a;簡單配置文件&#xff08;INI格式&#xff09;解析器 的完整內容&#xff0c;適合入門學習如何用 Go 語言解析常見的 .ini 配置文件格式。&#x1f3af; 案例目標使用 Go 語言解析一個 .ini 格式的配置文…

用 PyTorch 實現全連接網絡識別 MNIST 手寫數字

目錄 一、什么是全連接網絡 二、代碼實現步驟 1. 導入必要的庫 2. 數據準備 3. 定義網絡結構 4. 模型訓練 5. 模型保存和加載 6. 預測單張圖片 7. 主函數 三、運行結果說明 四、小結 一、什么是全連接網絡 全連接神經網絡&#xff08;Fully Connected Neural Networ…

vscode怎么安裝MINGW

下載&#xff1a; 第一步選擇MINGW官網&#xff1a;MinGW-w64 - for 32 and 64 bit Windows - SourceForge.net 點擊Files 點擊Toolchains targetting Win64 點擊第一個 Personal Builds 點擊mingw-builds 選擇8.1.0 點擊第二個 threads-posix 點擊第二個seh 最后左鍵點擊下…

CSS圖片分層設置

在CSS中實現圖片分層效果&#xff0c;主要通過定位屬性和層疊上下文控制。以下是核心實現方法和示例&#xff1a; 一、核心實現原理定位方式 使用 position: relative/absolute/fixed 使圖片脫離文檔流 .layer {position: absolute; /* 關鍵屬性 */top: 0;left: 0; }層疊控制 通…

GEMINUS 和 Move to Understand a 3D Scene

論文鏈接&#xff1a;https://arxiv.org/abs/2507.14456 代碼鏈接&#xff1a;https://github.com/newbrains1/GEMINUS 端到端自動駕駛的挑戰 端到端自動駕駛是一種“一站式”方法&#xff1a;模型直接從傳感器輸入&#xff08;如攝像頭圖像&#xff09;生成駕駛軌跡或控制信號…

算法與數據結構:線性表

C語言數據結構基礎&#xff1a;線性表詳解線性表是數據結構中最基礎、最常用的形式&#xff0c;就像一列整齊排隊的游客&#xff1a;每個元素有固定位置&#xff08;前驅和后繼&#xff09;&#xff0c;長度可動態變化。在C語言中&#xff0c;它主要通過順序表&#xff08;數組…

制作mac 系統U盤

使用 installinstallmacos.py&#xff08;更兼容&#xff09; 蘋果官方不提供所有歷史版本的安裝器&#xff0c;但可以通過一個開源腳本下載&#xff08;Apple 提供的企業支持工具&#xff09;&#xff1a; git clone https://github.com/munki/macadmin-scripts.git cd macadm…

滲透部分總結

docker環境搭建以及dns等原理講解Docker搭建&#xff1a;Linux 系統上安裝 Docker 引擎并啟動服務&#xff1a;# 安裝Docker引擎 curl -fsSL https://get.docker.com | sh 通過 curl 下載并執行 Docker 官方的安裝腳本&#xff0c;這會自動配置 Docker 倉庫并安裝最新版本的 Do…

k8s pvc是否可綁定在多個pod上

1.pvc是否可綁定在多個podPVC 是否能被多個 Pod 使用&#xff0c;取決于它的 accessModes。PVC 的 accessModes是否支持多個 Pod 同時使用說明ReadWriteOnce (RWO)? 若多個Pod&#xff0c;需在相同節點上&#xff08;僅允許被單個節點上的Pod掛載&#xff09;常用于本地磁盤、…

如何加固Endpoint Central服務器的安全?(下)

Endpoint Central 作為企業終端管理的 “中樞系統”&#xff0c;掌控著全網終端的補丁推送、軟件部署、配置管理、遠程控制等關鍵權限&#xff0c;存儲著大量終端資產信息、用戶數據及企業策略配置。一旦服務器被攻破&#xff0c;攻擊者可能篡改管理指令&#xff08;如推送惡意…

信息整合注意力IIA,通過雙方向注意力機制重構空間位置信息,動態增強目標關鍵特征并抑制噪聲

在遙感圖像語義分割等視覺任務中&#xff0c;編碼器 - 解碼器結構通過跳躍連接融合多尺度特征時&#xff0c;常面臨兩大挑戰&#xff1a;一是編碼器的局部細節特征與解碼器的全局語義特征融合時&#xff0c;空間位置信息易丟失&#xff0c;導致目標定位不準&#xff1b;二是復雜…

如何遷移jenkins至另一臺服務器

前言公司舊的服務器快到期了&#xff0c;需要將部署在其上的jenkins整體遷移到另一臺服務器&#xff0c;兩臺都是aws ec2服務器。文章主要提供給大家一種遷移思路&#xff0c;并不一定是最優解&#xff0c;僅供參考&#xff0c;大家根據實際情況自行選用和修改&#xff0c;舉一…

在vue中遇到Uncaught TypeError: Assignment to constant variable(常亮無法修改)

1.問題如下:2.出現這個問題的原因----在設計變量的時候采用了const來進行修飾,在修改的時候直接對其進行修改3.利用響應式變量的特點&#xff0c;修改為下面這樣就可以正常了

RCE隨筆-奇技淫巧(2)

Linux命令長度限制在7個字符的情況下&#xff0c;如何拿到shell <?php $param $_REQUEST[param]; If ( strlen($param) < 8 ) { echo shell_exec($param); }分析代碼&#xff1a;這段代碼傳入參數param然后進入if語句判斷是否小于8個字符&#xff0c;然后如果小于就會進…

設計模式九:構建器模式 (Builder Pattern)

動機(Motivation)1、在軟件系統中&#xff0c;有時候面臨著“一個復雜對象”的創建工作&#xff0c;其通常由各個部分的子對象用一定的算法構成&#xff1b;由于需求的變化&#xff0c;這個復雜對象的各個部分經常面臨著劇烈的變化&#xff0c;但是將它們組合在一起的算法卻相對…

如何高效合并音視頻文件

在自我學習或者進行視頻剪輯的時候&#xff0c;經常從資源網址下載音視頻分離的文件&#xff0c;例如audio_file1.m4a和video_1.mp4&#xff0c;之后需要把這兩個文件合并在一起。于是條件反射得想要利用剪映等第三方工具&#xff0c;進行音視頻的封裝。可惜不幸的是&#xff0…

虛幻 5 與 3D 軟件的協作:實時渲染,所見所得

《曼達洛人》的星際飛船在片場實時掠過虛擬荒漠&#xff0c;游戲開發者拖動滑塊就能即時看到角色皮膚的通透變化&#xff0c;實時渲染技術正以 “所見即所得” 的核心優勢&#xff0c;重塑著 3D 創作的整個邏輯。虛幻引擎 5&#xff08;UE5&#xff09;憑借 Lumen 全局光照和 N…

?Eyeriss 架構中的訪存行為解析(騰訊元寶)

?Eyeriss 架構中的訪存行為解析?Eyeriss 是 MIT 提出的面向卷積神經網絡&#xff08;CNN&#xff09;的能效型 NPU&#xff08;神經網絡處理器&#xff09;架構&#xff0c;其核心創新在于通過硬件結構優化訪存行為&#xff0c;以解決傳統 GPU 在處理 CNN 時因數據搬運導致的…

數字圖像處理(三:圖像如果當作矩陣,那加減乘除處理了矩陣,那圖像咋變):從LED冬奧會、奧運會及春晚等等大屏,到手機小屏,快來挖一挖里面都有什么

數字圖像處理&#xff08;三&#xff09;一、&#xff08;準備工作&#xff1a;咋玩&#xff0c;用什么玩具&#xff09;圖像以矩陣形式存儲&#xff0c;那矩陣一變、圖像立刻跟著變&#xff1f;1. Python Jupyter Notebook/Lab 庫 (NumPy, OpenCV, Matplotlib, scikit-image…

docker-desktop啟動失敗

報錯提示deploying WSL2 distributions ensuring main distro is deployed: checking if main distro is up to date: checking main distro bootstrap version: getting main distro bootstrap version: open \\wsl$\docker-desktop\etc\wsl_bootstrap_version: The network n…