首頁 > 軟體

Linux命令技巧分享:Bash Heredoc 使用範例

2020-06-16 16:36:05

編寫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指令碼中使用它。


IT145.com E-mail:sddin#qq.com