Shell腳本 <<EOF ... EOF語法(Here Document)(特殊的輸入重定向方式)(定界符)

文章目錄

    • Here Document語法
      • Here Document 的基本語法
      • 使用場景
    • 關于定界符
      • 定界符不是變量
      • 定界符在 Here Document 中只是一個字符串,主要功能是標記輸入文本的開始和結束,使用時應遵循最佳實踐格式要求
      • 例子和說明
        • 如何使用定界符
        • 定界符可重復使用,但不推薦重復使用
          • 示例說明
          • 最佳實踐

Here Document語法

在 Bash 腳本中,bc <<EOF ... EOF 結構使用了一種叫做 “Here Document” 的語法。這是一種特殊的輸入重定向方式,它允許您在腳本中直接內嵌一個多行的文本塊,并將這個文本塊作為輸入傳遞給命令。在這種情況下,它被用來提供輸入給 bc,這是一種命令行計算器。

Here Document 的基本語法

Here Document 的語法如下:

command <<DELIMITER
text
more text
DELIMITER
  • command 是需要輸入的命令。
  • DELIMITER 是一個自定義的結束符,用來標記輸入塊的開始和結束。這個結束符可以是任意字符串,如 EOFEND 等,只要它在文本塊中不會被誤解為其他內容。
  • textmore text 是將會傳遞給 command 的輸入內容。

在使用 bc 的例子中:

#!/bin/bashbc -l <<EOF
# 這里可以放入要執行的 bc 命令
a = 5
b = 3
a + b
l(2)
EOF

在這里插入圖片描述

這個腳本塊向 bc 傳遞了幾個計算指令。bc 將執行這些指令并返回結果。這種方法特別適合于需要傳遞復雜腳本或多行命令到 bc 時使用。

使用場景

Here Document 通常用于以下情況:

  • 自動化腳本中需要交互式命令的情況。
  • 提供配置文件或腳本給命令,尤其是在內容較長或較復雜時。
  • 簡化腳本書寫,避免多次 echo 或復雜的輸入重定向。

這種方法簡化了對 bc 等接受標準輸入的程序的命令輸入,使腳本更易于閱讀和維護。

關于定界符

定界符不是變量

在使用 Here Document (<<EOF ... EOF) 的結構時,EOF 并不一定要是一個全新的或未使用過的變量名。實際上,EOF 在這里并不作為變量使用,而是作為定界符,它的主要目的是明確地標記輸入文本的開始和結束。

然而,選擇一個合適的定界符確實非常重要,以避免與腳本中的其他文本混淆。這里有幾個關鍵點需要注意:

  1. 唯一性:定界符應該是獨特的,以確保它不會意外地出現在預期的輸入文本中。如果定界符在文本中出現,它會被解釋為 Here Document 的結束,這可能會導致腳本執行不正確。

  2. 一致性:通常使用 EOF 作為定界符,但您可以使用任何其他獨特且不太可能在文本中出現的字符串,比如 END, FINISH, STOP 等。

  3. 不是變量:雖然在很多編程場景中,像 EOF 這樣的詞可能看起來像是變量或命令的一部分,但在 Here Document 的上下文中,它只是一個文本標記。

定界符在 Here Document 中只是一個字符串,主要功能是標記輸入文本的開始和結束,使用時應遵循最佳實踐格式要求

定界符在 Here Document 中只是一個字符串,它的主要功能是標記輸入文本的開始和結束。使用 Here Document 時,定界符的選擇有一些基本的格式要求和最佳實踐:

  1. 唯一性:定界符應該是一個在所提供的文本內容中不會出現的唯一字符串。這是為了避免將部分文本內容錯誤地識別為定界符,導致輸入提前結束。

  2. 簡單性:通常建議使用簡單明了的字符串作為定界符,如 EOF(End of File 的縮寫)是非常常見的選擇。其他常用的字符串包括 ENDFINISH 等。

  3. 無空格:定界符不應包含空格或特殊字符。它應該是一個單一的、連續的字符串,以避免解釋上的錯誤。

  4. 大寫:雖然不是必須的,但常見的約定是使用全大寫字母來增加其在腳本中的可見性和區分度。

例子和說明

如何使用定界符

以下是一個使用 Here Document 的示例,演示了如何使用定界符:

#!/bin/bash# 使用 EOF 作為定界符
cat <<EOF
這是一些文本。
這里可以包括各種字符,除了定界符自身。
EOF# 使用自定義定界符
cat <<MY_END_MARKER
這里是更多的文本。
注意定界符 MY_END_MARKER 在文本中是唯一的。
MY_END_MARKER

在這里插入圖片描述

在這些示例中:

  • EOFMY_END_MARKER 都被用作定界符,它們在各自的 Here Document 中唯一,因此不會與文本內容混淆。
  • 在這些例子中,文本塊被直接傳遞給 cat 命令,它簡單地輸出這些文本到標準輸出。

總之,選擇合適的定界符是使用 Here Document 的關鍵部分,它確保了輸入的正確傳遞和腳本的可讀性。

定界符可重復使用,但不推薦重復使用

定界符可以在同一個腳本中重復使用,只要每次使用的上下文是清晰且獨立的。在使用 Here Document 的多個實例中,您可以使用相同的定界符,比如 EOF,因為每個 Here Document 的內容是從定界符開始到下一個相同定界符結束的文本塊。

每個 Here Document 是獨立處理的,因此在一個腳本中多次使用相同的定界符不會引起沖突或錯誤,只要確保每個 Here Document 的定界符匹配正確。

示例說明

以下是一個展示在同一個腳本中多次使用同一定界符的示例:

#!/bin/bash# 第一次使用 EOF 作為定界符
cat <<EOF
1.這是一些文本。這里可以包括各種字符,除了定界符自身。EOF# 第二次使用相同的定界符 EOF
cat <<EOF
2.這是另一些文本。這里可以包括各種字符,除了定界符自身。
EOF

在這里插入圖片描述

在這個腳本中,EOF 被用作兩個不同的 Here Document 的定界符。每個 cat 命令將從其對應的 <<EOF 開始,直到遇到下一個 EOF 為止。這兩個 Here Document 是完全獨立的,因此使用相同的定界符不會造成任何問題。

最佳實踐

雖然技術上可以在同一個腳本或上下文中重復使用相同的定界符,但在復雜的腳本或在有多個 Here Document 的情況下,使用不同的定界符有助于增加代碼的清晰度和可讀性,尤其是當 Here Document 的內容較長或邏輯較復雜時。這樣做可以幫助防止混淆和錯誤,特別是在維護或修改腳本時。

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

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

相關文章

Spring數據訪問全攻略:從JdbcTemplate到聲明式事務

上文講到 —— 航向數據之海&#xff1a;Spring的JPA與Hibernate秘籍 本文目錄 四. JdbcTemplate的使用定義JdbcTemplate及其在Spring中的作用展示如何使用JdbcTemplate簡化數據庫操作1. 配置JdbcTemplate2. 使用JdbcTemplate查詢數據3. 打印查詢結果 五. Spring的事務管理介紹…

橋接模式

橋接模式&#xff1a;在這種模式下&#xff0c;虛擬機就像是局域網中一臺獨立的主機&#xff0c;能夠訪問網內任何一臺機器。在橋接模式下&#xff0c;必須為虛擬系統手動配置IP地址、子網掩碼&#xff0c;并且這些配置需要與宿主機器處于同一網段&#xff0c;以便虛擬系統和宿…

leetcode-42. 接雨水(雙指針,前綴)

42. 接雨水 /*** param {number[]} height* return {number}*/ var trap function (height) {let len height.length;let pre_max new Array(len).fill(0);let suf_max new Array(len).fill(0);pre_max[0] height[0];suf_max[len - 1] height[len - 1];for (let i 1; i…

queue使用

C的queue是一種先進先出&#xff08;FIFO&#xff09;的數據結構&#xff0c;可以用來存儲一系列元素。它屬于STL&#xff08;Standard Template Library&#xff09;的一部分&#xff0c;以queue模板類的形式提供。 要使用queue&#xff0c;需要包含頭文件&#xff0c;并使用…

Linux shell編程學習筆記49:strings命令

0 前言 在使用Linux的過程中&#xff0c;有時我們需要在obj文件或二進制文件中查找可打印的字符串&#xff0c;那么可以strings命令。 1. strings命令 的功能、格式和選項說明 我們可以使用命令 strings --help 來查看strings命令的幫助信息。 pupleEndurer bash ~ $ strin…

在k8s中搭建elasticsearch高可用集群,并對數據進行持久化存儲

&#x1f407;明明跟你說過&#xff1a;個人主頁 &#x1f3c5;個人專欄&#xff1a;《洞察之眼&#xff1a;ELK監控與可視化》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目錄 一、引言 1、Elasticsearch簡介 2、k8s簡介 二、環境準備 …

Git項目管理——提交項目和版本回退(二)

個人名片&#xff1a; &#x1f393;作者簡介&#xff1a;嵌入式領域優質創作者&#x1f310;個人主頁&#xff1a;妄北y &#x1f4de;個人QQ&#xff1a;2061314755 &#x1f48c;個人郵箱&#xff1a;[mailto:2061314755qq.com] &#x1f4f1;個人微信&#xff1a;Vir2025WB…

android繪制多個黑豎線條

本文實例為大家分享了android繪制多個黑豎線條展示的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下 1.寫一個LinearLayout的布局&#xff0c;將寬度寫成5dp將高度寫成match_parent. 2.在寫一個類繼承LinearLayout&#xff0c;用LayoutInflater實現子布局的在這個L…

train_gpt2_fp32.cu - main

llm.c/test_gpt2_fp32.cu at master karpathy/llm.c (github.com) 源碼 // ---------------------------------------------------------------------------- // main training loop int main(int argc, char *argv[]) {// read in the (optional) command line argumentsco…

三.使用HashiCorp Vault工具管理數據庫

三.ubuntu安裝使用HashiCorp Vault工具管理數據庫 HashiCorp Vault 是一個基于身份的秘密和加密管理系統。機密是您想要嚴格控制訪問的任何內容,例如 API 加密密鑰、密碼和證書。Vault 提供由身份驗證和授權方法門控的加密服務。使用 Vault 的 UI、CLI 或 HTTP API,可以安全…

深度優先搜索匯總

常用英文 最近公共祖先&#xff08;Lowest Common Ancestor&#xff0c;簡稱LCA&#xff09; posterity&#xff0c;英語單詞&#xff0c;主要用作名詞&#xff0c;作名詞時譯為“子孫&#xff0c;后裔&#xff1b;后代”。 什么是深度優先搜索 深度優先搜索&#xff0c;D…

[前端] vue2的/deep/轉化為vue3語法(筆記)

vue2語法示例 <style scoped lang"less">/deep/.el-carousel__button {width: 8px;height: 3px;border-radius: 3px;}/deep/.el-carousel__indicator.is-active button {width: 16px;} } </style>在 Vue 3 中&#xff0c;/deep/ 或 >>> 選擇器…

24 內核開發- Linux 內核各種設計模式

24 內核開發- Linux 內核各種設計模式 Linux 內核中使用了各種設計模式來組織和結構其龐大的代碼庫。以下是 Linux 內核中的一些常見設計模式&#xff1a; 1. 單例模式&#xff1a; 模塊&#xff1a; init 模塊 目的&#xff1a; 初始化內核并創建第一個進程 (init_task) 實現…

uni-app 實現下拉單選功能(六)

總體的設計思想是,一個輸入框在客戶點擊時,彈出需要選擇的下拉框選項,客戶選擇完后,隱藏下拉框選項內容;并將選擇的數據填充到輸入框內。話不多說直接上代碼: <template> <view class="dianjianInfo"> <view class="uni-form…

文心一言指令

文心一言 文心一言&#xff08;ERNIE Bot&#xff09;是百度公司研發的知識增強大語言模型&#xff0c;它可以根據用戶的指令和輸入&#xff0c;生成相應的回答或文本。以下是一些可能的指令示例&#xff0c;用于指導文心一言完成不同的任務&#xff1a; 知識問答&#xff1a…

【oracle】圖片轉為字節、base64編碼等形式批量插入oracle數據庫并查詢

1.熟悉、梳理、總結下Oracle相關知識體系 2.歡迎批評指正&#xff0c;跪謝一鍵三連&#xff01; 資源下載&#xff1a; oci.dll、oraocci11.dll、oraociei11.dll3個資源文件資源下載&#xff1a; Instant Client Setup.exe資源下載&#xff1a; oci.dll、oraocci11.dll、oraoc…

LangChain_Tools

1、Tools 可以被Agent、Chain、LLM所使用。 2、tool 的必備屬性有&#xff1a;name、description、JSON schema &#xff08;tool輸入&#xff09;、調用的函數、工具的結果是否應直接返回給用戶。其中name、description和 JSON schema 可用于提示 LLM、寫入在LLM的system pro…

初識C語言——第二十一天

猜數字小游戲的實現&#xff1a; 學會了之后可以自己制作彩票抽獎&#xff0c;哈哈&#xff01; 代碼實現&#xff1a; #include <stdlib.h> #include <time.h>void menu()//無返回值函數 {printf("**************************\n");printf("****…

Linux:退出vim編輯模式

一、使用快捷鍵進行退出 1、按“Esc”鍵進入命令模式 當我們在vim編輯模式下輸入完畢需要進行退出操作時&#xff0c;首先需要按下“Esc”鍵&#xff0c;將vim編輯器從插入模式或者替換模式切換到命令模式。 ESC 2、輸入“:wq”保存并退出 在命令模式下&#xff0c;輸入“:…

在kubernetes中配置Ingress

目錄 1. 安裝Nginx Ingress Controller2. 準備TLS證書3. 編寫Ingress資源定義4. 應用Ingress配置5. 驗證配置 1. 安裝Nginx Ingress Controller 首先&#xff0c;確保你的Kubernetes集群已經準備好。你可以使用Helm或者直接通過yaml文件來安裝Nginx Ingress Controller。這里給…