2021-05-12 14:32:11
Linux命令技巧分享:Bash Heredoc 使用範例
編寫shell指令碼時,您可能需要將多行文字或程式碼塊傳遞給互動式命令,例如tee,cat或sftp。在Bash和其他類似Zsh的shell中,Here document(Heredoc)是一種重定向,允許您將多行輸入傳遞給命令。
編寫HereDoc的語法採用以下形式:
[COMMAND] <<[-] 'DELIMITER'
HERE-DOCUMENT
DELIMITER
- 第一行以可選命令開頭,後跟特殊重定向運算子<<和分隔識別符號。
- 您可以使用任何字串作為分隔識別符號,最常用的是EOF或END。
- 如果分隔識別符號未加引號,則在將here-document行傳遞給命令之前,shell將替換所有變數,命令和特殊字元。
- 將減號新增到重定向運算子<< - 將導致忽略所有前導製表符。 這允許您在此處寫入時使用縮排 - shell指令碼中的文件。 不允許使用前導空白字元,只允許使用製表符。
- here-document塊可以包含字串,變數,命令和任何其他型別的輸入。
- 最後一行以分隔識別符號結束。分隔符前的空白是不允許的。
基本的Heredoc例子
在本節中,我們將介紹如何使用heredoc的一些基本範例。
Heredoc最常與cat命令結合使用。
在下面的範例中,我們使用here document將包含環境變數和命令的兩行文字傳遞給cat。
linuxidc@linuxidc:~/linuxidc.com$ cat << EOF
> 當前的工作目錄是: $PWD
> 您登入的身份為: $(whoami)
> EOF
從下圖的輸出中可以看出,變數和命令都被替換:
當前的工作目錄是: /home/linuxidc/linuxidc.com
您登入的身份為: linuxidc
讓我們看看如果我們將分隔符用單引號或雙引號括起來會發生什麼。
linuxidc@linuxidc:~/linuxidc.com$ cat <<- "EOF"
> 當前的工作目錄是: $PWD
> 您登入的身份為: $(whoami)
> EOF
您可以注意到,當參照分隔符時,shell不會執行引數擴充套件和命令替換。
當前的工作目錄是: $PWD
您登入的身份為: $(whoami)
如果在語句或迴圈中使用heredoc,請使用<<- 重定向操作,允許您縮排程式碼。
if true; then
cat <<- EOF
Line with a leading tab.
EOF
fi
輸出:
Line with a leading tab.
您可以使用>,>>運算子將其重定向到檔案,而不是在螢幕上顯示輸出。
cat << EOF > linuxidc.txt
當前的工作目錄是: $PWD
您登入的身份為: $(whoami)
EOF
如果linuxidc.txt不存在,則會建立它。 使用時>檔案將被覆蓋,而>>將輸出附加到檔案。(如下圖)
還可以通過管道輸入heredoc。在下面的例子中,sed命令將用m替換所有i字元的範例:
linuxidc@linuxidc:~/linuxidc.com$ cat <<'EOF' | sed 's/i/m/g'
> idc
> linuxmi
> EOF
輸出如下:
mdc
lmnuxmm
要將管道資料寫入檔案:
linuxidc@linuxidc:~/linuxidc.com$ cat <<'EOF' | sed 's/i/m/g' > linuxidc.txt
> idc
> linuxmi
> EOF
使用Heredoc和SSH
使用Heredoc是通過SSH在遠端系統上執行多個命令的最方便和最簡單的方法之一。
使用不帶引號的分隔符時,請確保跳脫所有變數、命令和特殊字元,否則將在本地插入這些變數、命令和特殊字元。
ssh -T user@host.com << EOF
echo "The current local working directory is: $PWD"
echo "The current remote working directory is: $PWD"
EOF
輸出:
The current local working directory is: /home/linuxidc
The current remote working directory is: /home/user
您可能還需要設定基於SSH金鑰的身份驗證並連線到Linux伺服器而無需輸入密碼。
總結
在本指南中,您已經了解了什麼是heredoc以及如何在shell指令碼中使用它。
相關文章