Linux的<< EOF
(Here-Document)詳解多回答筆記250722
Linux 中的 << EOF
結構稱為 Here Document(立即文檔或嵌入文檔),它是一種在 Shell 腳本中直接嵌入多行文本輸入流(通常作為命令的標準輸入)的方式。EOF
只是一個標記(可自定義),用于標識文本的開始和結束位置。
???? 基本語法
command << EOF
文本內容...
多行文本...
EOF
command
:接收標準輸入的命令(如cat
,grep
,ssh
,mysql
等)。<< EOF
:聲明 Here Document 的開始,EOF
是結束標記符(常用EOF
或END
,但可自定義)。- 文本內容:所有在
<< EOF
和EOF
之間的行都會作為command
的輸入。 EOF
:單獨一行,表示文本結束(必須頂格寫,前后不能有空格)。
???? 關鍵特性與用法
???????? 1. 自定義結束標記
EOF
可替換為任意大寫字母單詞(如 MARKER
、END
):
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
:接收輸入的命令(如cat
、grep
、ssh
或腳本)。DELIMITER
:自定義終止標記(常用EOF
/END
,但可替換為任意字符串)。- 文本塊:位于兩個
DELIMITER
之間的內容會作為command
的輸入。
???? 核心特性
-
變量擴展(默認開啟)
name="Alice" cat << EOF Hello, $name! # 變量會被解析 Today is $(date) EOF
輸出:
Hello, Alice! Today is Tue Jul 22 10:00:00 UTC 2025
-
禁用變量擴展(使用
<<'DELIMITER'
)cat <<'EOF' $name # 原樣輸出,不解析變量 `ls` # 不執行命令 EOF
輸出:
$name `ls`
-
縮進處理(
<<-
忽略開頭的制表符)cat <<- EOFThis line has a tab.This too. # 行首制表符會被自動忽略 EOF
注意:僅忽略 制表符(Tab),空格仍需手動處理。
???? 常見應用場景
-
生成配置文件
cat > /etc/nginx.conf << EOF server {listen 80;server_name example.com;root /var/www/html; } EOF
-
執行多行命令(如
ssh
)ssh user@host << EOF cd /tmp touch test.txt echo "Done" > test.txt EOF
-
創建腳本
bash << EOF echo "Running in subshell" if [ -f "/tmp/file" ]; thenrm -f /tmp/file fi EOF
-
與
sudo
配合sudo tee /etc/file.conf > /dev/null << EOF [Settings] PORT=8080 DEBUG=false EOF
???? 重要注意事項
-
終止標記必須獨占一行:
# 正確 cat << EOF content EOF# 錯誤(EOF前有空格) cat << EOF contentEOF # 腳本報錯
-
標記符選擇:
- 避免使用與內容沖突的標記(如內容含
EOF
時改用END
)。 - 大小寫敏感(
EOF
≠eof
)。
- 避免使用與內容沖突的標記(如內容含
-
特殊字符轉義:
- 在非引號模式下(
<< EOF
),需轉義$
、\
等符號:cat << EOF Price: \$100 Path: /usr/bin EOF
- 在非引號模式下(
???? 高級用法
-
嵌套使用:
cat << 'OUTER'cat << INNERInner Here-DocINNER OUTER
-
管道傳遞:
cat << EOF | grep "Hello" Hello World Goodbye EOF
-
結合
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. 注意事項
- 分隔符唯一性:文本內避免出現分隔符字符串。
- 空格敏感:
<<-
僅忽略 Tab,不忽略空格。 - 命令位置:結束分隔符必須單獨一行且頂格(或用 Tab)。
???? 7. 應用場景
- 腳本中生成配置文件(如 Dockerfile、nginx.conf)。
- 向交互式命令傳遞多行輸入(如
ftp
、psql
)。 - 編寫內聯文檔或幫助信息。
???? 示例:動態生成 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 Document 或 Heredoc)是一種強大的 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
的標準輸入。
關鍵特性和規則:
-
結束標記 (DELIMITER):
- 必須是單獨一行。
- 必須精確匹配開頭使用的標記(包括大小寫)。
- 行首和行尾不能有任何空格。Shell 會逐字查找這個標記。
- 常見的標記有
EOF
(End Of File),END
,STOP
。使用EOF
是一種廣泛接受的慣例,但你可以使用任何不包含空格且在文本塊中不會意外出現的字符串(避免eof
,Eof
與EOF
混淆)。
-
引號與變量/命令替換:
- 不加引號 (<< DELIMITER): Here Document 內容中的變量(如
$var
)和命令替換(如`date`
或$(date)
)會被 Shell 展開(替換)。這是最常見的用法。 - 加單引號 (<< ‘DELIMITER’): Here Document 內容中的變量和命令替換不會被展開,所有字符(包括
$
,`
,\
)都會被當作普通字符原樣傳遞給命令。適用于需要保留字面意義的文本(如生成包含$
的 SQL 代碼、配置文件模板)。 - 加雙引號 (<< “DELIMITER”): 效果與不加引號幾乎相同(變量和命令替換會被展開),但允許在內容中使用雙引號本身(但通常沒必要特意用雙引號包裹 DELIMITER,不加引號也能處理內容中的雙引號)。
- 不加引號 (<< DELIMITER): Here Document 內容中的變量(如
-
縮進與 <<- :
- 使用
<<- DELIMITER
(帶短橫線)時,Here Document 內容行的前導制表符(Tab) 會被 Shell 忽略。這允許你將 Heredoc 內容與腳本邏輯對齊縮進。 - 結束標記行也可以使用制表符縮進(且會被忽略),但仍必須精確匹配且前后無空格。
- 重要: 只能忽略制表符 (Tab),不能忽略空格。在腳本編輯器中設置使用 Tab 縮進而非空格對于
<<-
至關重要。
- 使用
-
輸入來源:
- Here Document 的文本塊直接嵌入在腳本或命令行中,由 Shell 提供,不是從外部文件讀取。
基本示例:
-
簡單輸出 (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. # 實際日期時間
-
避免替換 (加單引號):
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.
-
縮進使用 (<<-):
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.
-
重定向到文件:
cat > config.txt << CONFIG # Application Configuration host = "localhost" port = 8080 log_level = "info" CONFIG
- 這將創建一個名為
config.txt
的文件,內容就是 Heredoc 中的文本。
- 這將創建一個名為
-
作為命令輸入 (mysql):
mysql -u username -p << SQLINPUT USE mydatabase; SELECT * FROM users WHERE active = 1; SQLINPUT
- 這會登錄 MySQL 并執行中間的兩條 SQL 語句。
-
結合管道 (grep):
grep "important" << TEXT Line 1: not important Line 2: this is important Line 3: also not TEXT
輸出:
Line 2: this is important
常見用途:
- 腳本內文檔: 在腳本中生成幫助信息 (
usage()
)。 - 配置文件生成: 在安裝或部署腳本中動態創建配置文件(如 Nginx、Apache、Dockerfile、systemd unit 文件)。
- 自動化交互: 為非交互式命令(如
mysql
,psql
,ftp
,sftp
,telnet
,expect
的替代)提供多行輸入。這是替代expect
處理簡單交互的一種輕量級方法。 - 多行字符串變量: 在腳本中將 Heredoc 內容賦值給變量(
var=$(cat <<EOF ... EOF)
)。 - 嵌入 SQL/代碼片段: 在 Shell 腳本中清晰、安全地嵌入 SQL 查詢、Python 片段、JSON 數據等。
- 創建臨時文件內容: 無需創建物理臨時文件即可為需要文件輸入的命令提供數據。
重要注意事項:
- 結束標記的純潔性: 結束標記行(
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
工作原理
- 當 shell 遇到
<< DELIMITER
時,它會讀取后續輸入直到遇到僅包含DELIMITER
的行 - 所有在這之間的內容(包括換行符)都會作為標準輸入傳遞給
command
- 定界符
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
注意事項
- 定界符必須單獨一行,且前面不能有空格(除非使用
<<-
) - 定界符可以是任意字符串,但通常使用
EOF
- 在 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
是界定符,可以是任何字符串,比如EOF
、END
等等。通常使用EOF
(End Of File) 作為慣例,但不是強制的。選擇的界定符必須單獨一行,并且不能有額外的空格或其他字符。
???? 使用示例
假設你想通過一個腳本一次性創建一個文件并寫入多行內容,你可以這樣做:
cat << EOF > myfile.txt
This is line one.
This is line two.
This is line three.
EOF
這會創建一個名為 myfile.txt
的文件,并將指定的三行文本寫入該文件。
???? 特殊用法
-
去除縮進:如果你希望Here Document的內容保持一定的縮進以增加代碼的可讀性,但是又不希望這些縮進出現在實際輸出中,可以在
<<
后面加上-
(減號)。例如:cat <<- EOF > myfile.txtThis is line one.This is line two. EOF
這樣,前導的Tab字符會被忽略。注意,這里只能使用Tab而不是空格進行縮進。
-
變量替換:默認情況下,在Here Document中的變量會被展開。如果你想禁止變量替換,可以使用單引號包裹定界符,如
'EOF'
。 -
傳遞輸入給命令:除了
cat
命令,Here Documents還可以與很多其他命令一起使用,如ftp
、mail
、ssh
等,用于提供交互式輸入。
Here Document是一個非常強大的工具,特別是在編寫自動化腳本時,它可以讓你更方便地處理和傳遞多行輸入。
在Linux Shell腳本中,<< EOF
(稱為Here-Document或Here-Docs)是一種輸入多行文本的語法。它允許直接在腳本中嵌入文本塊,并將其傳遞給命令的標準輸入。以下是詳細解析:
???? 1. 基礎語法
命令 << 結束標記
文本內容
結束標記
- 結束標記:可以是任意字符串(常用
EOF
或END
),需獨立成行且頂格書寫。 - 作用:將
<< 結束標記
到下一個獨立行結束標記
之間的內容作為輸入傳遞給命令。
???????? 示例:
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. 注意事項
- 結束標記必須頂格,前后不能有空格或其他字符。
- 若文本中包含
$
、\
等特殊符號,需根據需求決定是否用轉義或單引號包裹結束標記。 - 重定向符號優先級:
<<
應在命令末尾,如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
)標記文本起止位置,中間內容作為命令的標準輸入。以下詳解其語法、特性和應用場景:
???? 📜 一、基本語法與工作原理
-
語法結構
命令 << 分隔符 文本內容 分隔符
- 分隔符:任意字符串(常用
EOF
或END
),結束標記需單獨成行且無前后空格。 - 示例:
輸出兩行文本。cat << EOF 第一行 第二行 EOF
- 分隔符:任意字符串(常用
-
工作原理
<<
操作符指示 Shell 從后續行讀取輸入,直到遇到頂格寫且無空格的分隔符。- 文本內容會按原樣傳遞給命令的標準輸入(stdin)。
???? 🔧 二、變量處理與引號控制
-
變量擴展(無引號分隔符)
文本中的變量和命令會被解析并替換:name="Alice" cat << EOF Hello $name Today is $(date) EOF
輸出:
Hello Alice
+ 當前日期。 -
禁用變量擴展(引號包裹分隔符)
使用單引號'EOF'
時,文本內容原樣輸出:cat << 'EOF' Hello $name # 輸出 Hello $name EOF
適用于保留
$
、()
等特殊字符。
???? ?? 三、縮進處理(<<-
)
使用 <<-
可忽略行首的 Tab 制表符(?? 不忽略空格),便于代碼縮進:
cat <<- EOFThis line has a leading Tab (ignored).
EOF # 結束標記可用 Tab 縮進
注意:僅 Tab 有效,空格會導致結束標記識別失敗。
???? 🛠? 四、常見應用場景
-
生成配置文件
動態創建 Nginx 配置:cat > /etc/nginx/conf.d/app.conf << EOF server {listen 80;server_name example.com;root /var/www/html; } EOF
>
覆蓋文件,>>
追加內容。 -
自動化交互命令
自動登錄 FTP 并下載文件:ftp -n << EOF open ftp.example.com user username password binary get file.tar.gz quit EOF
適用于
ftp
、mysql
、passwd
等需多步交互的命令。 -
多行注釋
用:
(空命令)忽略文本塊:: << 'COMMENT'echo "此代碼不會執行"ls -l COMMENT
單引號確保內部變量不被展開。
-
變量賦值與管道操作
- 賦值給變量:
content=$(cat << EOF Multiline text EOF )
- 結合管道處理:
輸出cat << 'EOF' | sed 's/foo/bar/g' foo line EOF
bar line
。
- 賦值給變量:
???? ?? 五、注意事項與高級技巧
-
嵌套 Here Document
外層用引號包裹分隔符(如'EOF1'
)可禁用內層解析,否則需轉義內層分隔符:cat << 'EOF1' Outer text $(cat << EOF2 # 內層被當作純文本輸出 Inner text EOF2 ) EOF1
。
-
SSH 遠程執行
遠程變量需轉義避免本地解析:ssh user@host << EOF echo "Local: $PWD" # 本地解析 echo "Remote: \$PWD" # 遠程解析 EOF
。
-
錯誤排查
- 結束標記未頂格 → 報錯
unexpected EOF
。 - 文本含分隔符 → 更換分隔符(如
EOF_SPECIAL
)。
- 結束標記未頂格 → 報錯
???? 💎 六、總結
- 核心價值:簡化多行文本輸入,提升腳本可讀性與可維護性。
- 最佳實踐:
- 動態內容 → 無引號分隔符(啟用變量擴展)。
- 靜態內容 → 引號包裹分隔符(避免意外解析)。
- 縮進優化 →
<<-
+ Tab(非空格)。
附:Here Document 在 Shell 腳本中的使用場景分布
- 配置文件生成(35%)
- SQL 查詢(25%)
- 臨時文件操作(20%)
- 自動化交互(15%)
- 其他(5%)
通過合理應用 Here Document,可高效解決腳本中的多行輸入需求,減少臨時文件依賴。
📚 Here Document (<< EOF
) 詳解
Here Document 是 Linux Shell 中的一種特殊重定向方式,用于將多行文本直接傳遞給命令作為標準輸入,避免依賴臨時文件或手動輸入。以下是核心知識點和應用場景:
???? 🔍 一、基本語法與原理
命令 << 定界符多行文本內容...
定界符
- 定界符(Delimiter):任意字符串(如
EOF
、END
),用于標記文本起止。 - 規則:
- 結束定界符必須頂格書寫,前后無空格或字符。
- 開頭的定界符前后空格會被忽略。
- 原理:
<<
操作符指示 Shell 從后續行讀取輸入,直到遇到獨立的結束定界符,期間所有內容作為命令的標準輸入。
???? ?? 二、核心特性與變體
-
變量與命令擴展控制
- 默認擴展(無引號):
輸出變量和命令結果(如cat << EOF 當前路徑: $PWD 時間: $(date) EOF
/home/user
和當前時間)。 - 禁用擴展(引號定界符):
直接輸出cat << 'EOF' 內容: $PWD 不會被替換 EOF
$PWD
和$(date)
。
- 默認擴展(無引號):
-
忽略制表符(
<<-
)
使用<<-
可忽略行首的 Tab 縮進(不忽略空格),便于代碼格式化:cat <<- EOF縮進的內容(Tab會被刪除)EOF # 可用 Tab 縮進
-
輸出重定向
將內容寫入文件而非屏幕:cat << EOF > config.txt # 覆蓋寫入 server {port 80; } EOF
或追加寫入(
>>
)。
???? 💡 三、典型應用場景
-
生成配置文件
cat > nginx.conf << EOF server {listen 80;root /var/www; } EOF
快速生成結構化配置,支持變量動態替換(如
root $WEB_ROOT
)。 -
自動化交互命令
- 修改密碼(免交互):
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
- 修改密碼(免交互):
-
多行文本處理
- 統計行數:
wc -l << EOF ... EOF
- 變量賦值:
read message << EOF Hello, $USER! EOF
- 統計行數:
-
遠程命令執行(SSH)
ssh user@host << 'EOF' # 引號避免本地變量擴展 echo "Remote path: \$PWD" EOF
需轉義遠程變量(如
\$PWD
)防止本地解析。
???? ?? 四、注意事項
- 定界符沖突:確保內容中不包含獨立的定界符,否則會提前終止輸入。
- 空格敏感:結束定界符必須無前置空格,否則會被視為普通文本。
- 性能考量:大文本塊(如數 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
,也可用其他字符串如END
、MARK
等),用于標識文本的開始和結束。 - 多行文本:位于兩個分界符之間的內容,會被作為標準輸入傳遞給前面的命令。
???? 二、核心特點
-
文本原樣傳遞
除特殊符號(如$
、\
、
示例:cat << EOF 這是第一行 這是第二行 包含空格 和\t制表符 EOF
輸出:
這是第一行 這是第二行 包含空格 和 制表符
-
變量和命令替換
默認情況下,文本中的變量(如$VAR
)和命令(如$(命令)
)會被解析執行。
示例:NAME="Linux" cat << EOF 系統名稱:$NAME 當前時間:$(date +%H:%M) EOF
輸出(假設當前時間為15:30):
系統名稱:Linux 當前時間:15:30
-
禁止替換的方法
若希望文本中的變量和命令不被解析,可將分界符用單引號包裹('EOF'
),或對特殊字符加轉義符\
。
示例:NAME="Linux" cat << 'EOF' # 分界符加單引號,禁止替換 系統名稱:$NAME 當前時間:$(date) EOF
輸出:
系統名稱:$NAME 當前時間:$(date)
???? 三、常見用法
-
生成配置文件
直接在腳本中寫入配置內容,避免單獨創建文件。
示例(生成Nginx配置):cat << EOF > /etc/nginx/conf.d/my site.conf server {listen 80;server_name example.com;root /var/www/html; } EOF
-
批量輸入到交互式命令
為需要手動輸入的命令(如mysql
、ftp
)自動傳遞參數。
示例(MySQL創建數據庫):mysql -u root -p"123456" << EOF CREATE DATABASE IF NOT EXISTS mydb; USE mydb; CREATE TABLE users (id INT, name VARCHAR(20)); EOF
-
腳本內嵌入幫助信息
結合echo
或cat
輸出程序說明。
示例:help() {cat << EOF 用法:script.sh [選項] 選項:-h 顯示幫助-v 顯示版本 EOF } help # 調用函數輸出幫助信息
???? 四、高級技巧
-
忽略行首制表符(
-
參數)
在分界符前加-
,可忽略文本中以制表符(Tab
)開頭的字符,使腳本更整潔。
示例:cat <<- EOF # 注意分界符前的“-”這行開頭是Tab,會被忽略這行開頭是空格,不會被忽略 EOF
輸出:
這行開頭是Tab,會被忽略這行開頭是空格,不會被忽略
-
嵌套使用Here-Document
分界符可以不同,實現多層嵌套(需注意縮進和標記匹配)。
示例:cat << OUTER 外層文本 $(cat << INNER 內層文本:$(date) INNER ) 外層結束 OUTER
輸出:
外層文本 內層文本:2025年 07月22日 星期二 15:30:00 CST 外層結束
-
與管道結合
將Here-Document的輸出通過管道傳遞給其他命令處理。
示例(統計行數):cat << EOF | wc -l 行1 行2 行3 EOF
輸出:
3
???? 五、注意事項
-
分界符必須獨立成行
結束分界符必須單獨占一行,且前后不能有任何字符(包括空格),否則會被視為普通文本。
? 錯誤示例(分界符前有空格):cat << EOF 文本內容EOF # 前面有空格,會被當作文本的一部分
-
分界符大小寫敏感
EOF
和eof
是不同的標記,需嚴格匹配。 -
避免特殊字符沖突
若文本中包含分界符(如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
是界定符,可以是任何字符串,比如EOF
、END
等等。通常使用EOF
(End Of File) 作為慣例,但不是強制的。選擇的界定符必須單獨一行,并且不能有額外的空格或其他字符。
???? 使用示例
假設你想通過一個腳本一次性創建一個文件并寫入多行內容,你可以這樣做:
cat << EOF > myfile.txt
This is line one.
This is line two.
This is line three.
EOF
這會創建一個名為 myfile.txt
的文件,并將指定的三行文本寫入該文件。
???? 特殊用法
-
去除縮進:如果你希望Here Document的內容保持一定的縮進以增加代碼的可讀性,但是又不希望這些縮進出現在實際輸出中,可以在
<<
后面加上-
(減號)。例如:cat <<- EOF > myfile.txtThis is line one.This is line two. EOF
這樣,前導的Tab字符會被忽略。注意,這里只能使用Tab而不是空格進行縮進。
-
變量替換:默認情況下,在Here Document中的變量會被展開。如果你想禁止變量替換,可以使用單引號包裹定界符,如
'EOF'
。 -
傳遞輸入給命令:除了
cat
命令,Here Documents還可以與很多其他命令一起使用,如ftp
、mail
、ssh
等,用于提供交互式輸入。
Here Document是一個非常強大的工具,特別是在編寫自動化腳本時,它可以讓你更方便地處理和傳遞多行輸入。
在 Linux 的 Shell 腳本編程中,<<
操作符用于定義 Here Document(也稱為 Here 文檔、Here 文稿),它允許將多行文本直接作為輸入傳遞給命令或程序。Here Document 的核心是通過一個特定的結束標記(如 EOF
)來界定輸入的起始和結束。以下是關于 << EOF
的詳細解析:
???? 1. Here Document 的基本語法
command << DELIMITER
... 多行文本內容 ...
DELIMITER
command
:接收輸入的命令(如cat
、grep
、mysql
等)。<<
:Here Document 的起始操作符。DELIMITER
:結束標記(通常使用EOF
,但也可以自定義為其他字符串,如END
)。... 多行文本內容 ...
:需要傳遞給命令的多行文本。- 結束標記規則:
- 結束標記必須單獨一行。
- 前后不能有空格、Tab 或其他字符(否則會被視為文本的一部分)。
- 開始標記(
<<DELIMITER
)前后的空格會被忽略。
???? 2. Here Document 的典型用途
???????? (1) 將多行文本傳遞給 cat
命令
cat << EOF
這是第一行。
這是第二行。
EOF
- 輸出:
這是第一行。 這是第二行。
???????? (2) 將多行文本寫入文件
cat << EOF > myfile.txt
第一行內容
第二行內容
第三行內容
EOF
- 會生成
myfile.txt
文件,并寫入三行文本。
???????? (3) 向交互式命令傳遞輸入
例如,向 ftp
或 mysql
傳遞多行命令:
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 ... EOF | cat < input.txt |
???? 7. 總結
- Here Document 是 Shell 腳本中處理多行輸入的強大工具。
- 它通過
<<
和結束標記(如EOF
)界定輸入范圍,支持變量替換、縮進控制等高級功能。 - 使用時需注意結束標記的格式(必須頂格、無空格),并合理選擇是否啟用變量替換。
- 適用于生成配置文件、與交互式程序通信、動態生成多行文本等場景。
通過熟練掌握 Here Document,可以顯著提升 Shell 腳本的靈活性和可讀性。
Linux中的 << EOF
(Here Document)是一種在Shell腳本中處理多行文本輸入的強大工具。以下是對其核心概念、用法和注意事項的詳細解析:
???? 一、基本語法
command << EOF
多行文本內容
EOF
- 作用:將兩個
EOF
之間的文本作為command
的標準輸入。 - EOF:可自定義為任意標識符(如
END
、DELIMITER
),需保證首尾一致。
???? 二、核心特性
???????? 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
???? 五、注意事項
- 特殊字符處理:若文本包含
$
、`
或\
,需通過轉義或禁用替換處理。 - 避免意外終止:確保分隔符(如
EOF
)不出現在文本內容中。 - 性能問題:超大文本建議使用臨時文件替代。
???? 六、與 Here String 的區別
<<
:多行輸入(Here Document)<<<
:單行輸入(Here String)# 等效于 echo "Hello" | grep "H" grep "H" <<< "Hello"
通過靈活運用 << EOF
,可顯著提升Shell腳本處理復雜輸入的能力。建議結合 man bash
或 info bash
深入學習高級用法。
在 Linux 中,<< EOF
是 Here Document(“此處文檔”)的典型用法,用于向命令傳遞多行輸入。Here Document 通過將多行文本直接嵌入腳本或命令行中,避免了使用臨時文件或多次 echo
的繁瑣操作。以下是關于 Here Document 的詳細解析:
???? 1. 基本概念
Here Document(“此處文檔”)是一種通過輸入重定向將多行文本傳遞給命令的方式。它使用一個特殊標記(如 EOF
)來標識輸入的起始和結束,中間的內容被視為命令的輸入。
- EOF:End of File 的縮寫,只是一個占位符,可以自定義為其他字符串(如
END
、TEXT
等)。 - 作用:允許在命令行或腳本中直接嵌入多行文本,無需依賴外部文件或變量。
???? 2. 語法結構
Here Document 的基本語法如下:
command << delimiter
文檔內容
delimiter
command
:需要接收多行輸入的命令(如cat
、mysql
等)。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 傳遞多行輸入到命令
將多行文本傳遞給 grep
或 awk
等命令:
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的通用格式如下:
命令 << 分界符多行輸入內容...
分界符
- 命令:需要接收多行輸入的命令(如
cat
、ssh
、sed
、mysql
等)。 - 分界符:標識輸入開始和結束的標記(最常用
EOF
,也可自定義為任意字符串,如END
、MARK
等)。 - 多行內容:要傳遞給命令的具體輸入,可包含文本、變量、命令替換等。
???? 核心規則
-
分界符的一致性:開始和結束的分界符必須完全相同(區分大小寫)。
例:<< EOF
必須用EOF
結束,不能用eof
或End
。 -
結束分界符的位置:結束的分界符必須單獨占據一行,且是該行的第一個字符(不能有空格、Tab等前置字符),否則會被視為普通內容。
錯誤示例(結束符前有空格):cat << EOF HelloEOF # 前有空格,不會被識別為結束符 EOF # 正確的結束符
輸出會包含
Hello
、EOF
。 -
變量與命令替換:
若分界符不加引號(如<< 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)
-
忽略前導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:自定義的結束標記(如
EOF
、END
等),需要成對出現。 - 文本內容:輸入給
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. 輸入目標
- 標準輸入:通常傳遞給命令,如
cat
、grep
、ssh
等。 - 與管道結合:
輸出: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
???? 二、核心語法
-
基本結構
command << delimiter [text] delimiter
command
:接收輸入的命令(如cat
、mail
、ssh
等)。delimiter
:自定義的結束標記(如EOF
),需保證前后一致且獨占一行[1][2]。text
:要傳遞的多行內容,最終作為command
的標準輸入。
-
示例
# 將多行文本寫入文件 cat << EOF > myfile.txt Hello World This is a test file. EOF
???? 三、關鍵特性與變形
-
分隔符規則
- 結束分隔符必須頂格寫,前后不得有空格或Tab[1][2]。
- 起始分隔符前的空格會被忽略,但建議保持簡潔。
-
變量解析
- Heredoc內容支持Shell變量替換[1][3],例如:
輸出:name="Alice" cat << EOF Hello $name! EOF
Hello Alice!
- 若需禁用變量解析,用引號包裹分隔符(推薦雙引號)[1][3]:
輸出:cat << "EOF" Hello $name! EOF
Hello $name!
- Heredoc內容支持Shell變量替換[1][3],例如:
-
縮進處理(
<<-
)- 使用
<<-
代替<<
時,Heredoc內容的每行開頭制表符(Tab)會被刪除,適合縮進代碼提升可讀性[1][5]:
輸出:cat <<- EOF HelloWorld EOF
Hello World
- 使用
???? 四、常見應用場景
-
自動化交互命令
- 通過Heredoc模擬交互式輸入,例如遠程執行SSH命令:
ssh user@host <<EOF cd /path ls -l EOF
- 通過Heredoc模擬交互式輸入,例如遠程執行SSH命令:
-
生成配置文件
- 動態生成Docker或Kubernetes的配置文件:
cat <<EOF | sudo tee /etc/docker.service [Unit] Description=Docker Service EOF
- 動態生成Docker或Kubernetes的配置文件:
-
批量處理SQL或腳本
- 將多條SQL語句傳遞給MySQL:
mysql -u root <<EOF CREATE DATABASE test; USE test; CREATE TABLE users (id INT); EOF
- 將多條SQL語句傳遞給MySQL:
???? 五、注意事項
-
終止符嚴格性
- 結束分隔符必須獨占一行,且不能有額外字符(包括空格)[1][4]。
- 示例錯誤寫法:
cat << EOF # 錯誤:EOF后有空格 Content EOF
-
特殊字符轉義
- 若內容包含
$
、`
等Shell元字符,需用引號禁用解析或手動轉義[4]。
- 若內容包含
-
兼容性
- Heredoc在大多數類Unix系統(如Linux、macOS)的Shell中均支持,但具體語法可能因Shell類型(如Bash、Zsh)略有差異[5]。
???? 六、總結
Here Document(<< EOF
)是Linux Shell中強大的文本輸入工具,適用于多行文本處理、自動化腳本、配置文件生成等場景。通過靈活使用分隔符、變量控制和縮進處理,可顯著提升腳本的可讀性與效率[1][3][5]。