Shell參數擴展形式學習筆記

Shell參數擴展形式學習筆記

文章目錄

  • Shell參數擴展形式學習筆記
    • 空值判斷處理 ${parameter:-word} ${parameter:=word} ${parameter:?word} ${parameter:+word}
    • 變量位置截取 ${parameter:offset} ${parameter:offset:length}
    • 變量匹配組合 ${!prefix*} ${!prefix@} ${!name[@]} ${!name[*]}
    • 獲取長度 ${#parameter}
    • 變量匹配刪除 ${parameter#word} ${parameter##word} ${parameter%word} ${parameter%%word}
    • 變量文本替換 ${parameter/pattern/string} ${parameter//pattern/string} ${parameter/#pattern/string} ${parameter/%pattern/string}
    • 大小寫轉換 ${parameter^pattern} ${parameter^^pattern} ${parameter,pattern} ${parameter,,pattern}
    • 變量特定操作 ${parameter@operator}

在 Bash 的官方文檔中,你可以查找關于 Shell 參數擴展的章節,通常位于“3.5.3 Shell Parameter Expansion”章節將提供關于 ${} 語法以及其他參數擴展形式的詳細說明和示例。

鏈接如下:
https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

空值判斷處理 ${parameter:-word} ${parameter:=word} ${parameter:?word} ${parameter:+word}

舉例說明:

這四種 ${} 形式的區別如下:

  1. ${parameter:-word}:如果變量 parameter 未定義或為空,則使用默認值 word,并將其擴展為該值;否則,保持變量 var 的原始值。

    示例:

    var="value"
    echo "${var:-default}"  # 輸出 "value"
    unset var
    echo "${var:-default}"  # 輸出 "default"
    
  2. ${parameter:=word}:如果變量 parameter 未定義或為空,則將其設置為默認值 word,并將其擴展為該值;否則,保持變量 var 的原始值。

    示例:

    var="value"
    echo "${var:=default}"  # 輸出 "value"
    unset var
    echo "${var:=default}"  # 輸出 "default"
    
  3. ${parameter:?word}:如果變量 parameter 未定義或為空,則輸出錯誤信息 word 到標準錯誤輸出,并退出腳本;否則,將變量 var 的值擴展為其原始值。

    示例:

    var="value"
    echo "${var:?Variable var is not set.}"  # 輸出 "value"
    unset var
    echo "${var:?Variable var is not set.}"  # 輸出錯誤信息到標準錯誤輸出并退出腳本
    
  4. ${parameter:+word}:如果變量 parameter 已經被設置并且不為空,則將其擴展為 word;否則,將其擴展為空字符串。

    示例:

    var="value"
    echo "${var:+default}"  # 輸出 "default"
    unset var
    echo "${var:+default}"  # 輸出空字符串
    

總結:

  • ${parameter:-word}${parameter:=word} 用于提供默認值,但前者不會改變變量的值,后者會在變量未定義或為空時設置變量的值。
  • ${parameter:?word} 用于檢查變量是否已定義,未定義則輸出錯誤信息并退出腳本。
  • ${parameter:+word} 用于檢查變量是否已設置并且不為空,是則擴展為指定值,否則擴展為空字符串。

變量位置截取 ${parameter:offset} ${parameter:offset:length}

這兩種形式都是 Bash 中的參數擴展形式,用于提取字符串的子串。它們的區別在于提取子串的方式:

  1. ${parameter:offset}:從變量 parameter 的字符串中提取從偏移量 offset 開始的子串,直到字符串的末尾。

    示例:

    str="abcdefg"
    echo "${str:2}"  # 輸出 "cdefg",從位置 2 開始提取子串
    
  2. ${parameter:offset:length}:從變量 parameter 的字符串中提取從偏移量 offset 開始,長度為 length 的子串。

    示例:

    str="abcdefg"
    echo "${str:2:3}"  # 輸出 "cde",從位置 2 開始提取長度為 3 的子串
    

總結:

  • ${parameter:offset} 提取從偏移量 offset 開始到字符串末尾的子串。
  • ${parameter:offset:length} 提取從偏移量 offset 開始,長度為 length 的子串。

變量匹配組合 ${!prefix*} ${!prefix@} ${!name[@]} ${!name[*]}

這四種形式都是 Bash 中的間接引用形式,用于引用以特定前綴開頭的變量名。它們的區別在于展開的方式和結果:

  1. ${!prefix*}:展開以 prefix 開頭的所有變量名,并返回由這些變量值組成的字符串列表,每個變量值之間用空格分隔。

    示例:

    var1="value1"
    var2="value2"
    echo "${!var*}"  # 輸出 "var1 var2"
    
  2. ${!prefix@}:與 ${!prefix*} 類似,展開以 prefix 開頭的所有變量名,并返回由這些變量值組成的字符串列表,每個變量值之間用空格分隔。

    示例:

    var1="value1"
    var2="value2"
    echo "${!var@}"  # 輸出 "var1 var2"
    
  3. ${!name[@]}:展開數組 name 中的所有元素,并返回由這些元素值組成的字符串列表,每個元素值之間用空格分隔。

    示例:

    array=("value1" "value2")
    echo "${!array[@]}"  # 輸出 "value1 value2"
    
  4. ${!name[*]}:與 ${!name[@]} 類似,展開數組 name 中的所有元素,并返回由這些元素值組成的單個字符串,元素值之間用第一個字符為 IFS 的字符分隔(默認為空格)。

    示例:

    array=("value1" "value2")
    echo "${!array[*]}"  # 輸出 "value1 value2"
    

總結:

  • ${!prefix*}${!prefix@} 展開以 prefix 開頭的所有變量名,并返回由這些變量值組成的字符串列表,每個變量值之間用空格分隔。
  • ${!name[@]}${!name[*]} 展開數組 name 中的所有元素,并返回由這些元素值組成的字符串列表或單個字符串,元素值之間用空格或 IFS 分隔。

獲取長度 ${#parameter}

${#parameter} 是 Bash 中的參數長度擴展形式,用于獲取變量 parameter 的長度。這個形式可以用于獲取字符串的長度,也可以用于獲取數組的元素個數。

示例:

# 獲取字符串的長度
str="Hello, world!"
echo "${#str}"  # 輸出 "13"# 獲取數組的元素個數
array=("apple" "banana" "orange")
echo "${#array[@]}"  # 輸出 "3"

在第一個示例中,${#str} 返回字符串變量 str 的長度,即 13。
在第二個示例中,${#array[@]} 返回數組變量 array 中元素的個數,即 3。

變量匹配刪除 ${parameter#word} ${parameter##word} ${parameter%word} ${parameter%%word}

這四種形式都是 Bash 中的模式刪除操作,用于從變量值中刪除匹配的部分。它們的區別在于匹配的方式和刪除的范圍:

  1. ${parameter#word}:刪除變量 parameter 值開頭匹配的最短部分(即最短匹配)。

    示例:

    path="/path/to/file.txt"
    echo "${path#*/}"  # 輸出 "path/to/file.txt",刪除第一個斜杠及其之前的部分
    
  2. ${parameter##word}:刪除變量 parameter 值開頭匹配的最長部分(即最長匹配)。

    示例:

    path="/path/to/file.txt"
    echo "${path##*/}"  # 輸出 "file.txt",刪除最后一個斜杠及其之前的部分
    
  3. ${parameter%word}:刪除變量 parameter 值結尾匹配的最短部分(即最短匹配)。

    示例:

    filename="file.txt"
    echo "${filename%.*}"  # 輸出 "file",刪除最后一個點及其之后的部分
    
  4. ${parameter%%word}:刪除變量 parameter 值結尾匹配的最長部分(即最長匹配)。

    示例:

    filename="file.txt"
    echo "${filename%%.*}"  # 輸出 "file",刪除最后一個點及其之后的部分
    

總結:

  • ${parameter#word}${parameter##word} 用于從變量值的開頭匹配刪除指定部分,區別在于前者是最短匹配,后者是最長匹配。
  • ${parameter%word}${parameter%%word} 用于從變量值的結尾匹配刪除指定部分,區別在于前者是最短匹配,后者是最長匹配。

變量文本替換 ${parameter/pattern/string} ${parameter//pattern/string} ${parameter/#pattern/string} ${parameter/%pattern/string}

這四種形式都是 Bash 中的模式替換操作,用于在變量值中替換匹配的部分。它們的區別在于替換的范圍和方式:

  1. ${parameter/pattern/string}:將變量 parameter 值中第一個匹配的 pattern 替換為 string

    示例:

    text="apple banana banana"
    echo "${text/ban/orange}"  # 輸出 "apple orangeana banana",只替換第一個匹配的 "ban"
    
  2. ${parameter//pattern/string}:將變量 parameter 值中所有匹配的 pattern 替換為 string

    示例:

    text="apple banana banana"
    echo "${text//ban/orange}"  # 輸出 "apple orangeana orangeana",替換所有匹配的 "ban"
    
  3. ${parameter/#pattern/string}:如果變量 parameter 值以 pattern 開頭,則將其替換為 string

    示例:

    filename="file.txt"
    echo "${filename/#file/path}"  # 輸出 "path.txt",替換開頭的 "file"
    
  4. ${parameter/%pattern/string}:如果變量 parameter 值以 pattern 結尾,則將其替換為 string

    示例:

    filename="file.txt"
    echo "${filename/%.txt/.csv}"  # 輸出 "file.csv",替換結尾的 ".txt"
    

總結:

  • ${parameter/pattern/string}${parameter//pattern/string} 用于在變量值中進行模式替換,前者替換第一個匹配,后者替換所有匹配。
  • ${parameter/#pattern/string}${parameter/%pattern/string} 用于在變量值的開頭和結尾匹配替換,分別替換開頭和結尾的匹配部分。

大小寫轉換 ${parameter^pattern} ${parameter^^pattern} ${parameter,pattern} ${parameter,pattern}

這四種形式都是 Bash 中的大小寫轉換操作,用于將變量值中匹配的部分進行大小寫轉換。它們的區別在于轉換的方式和范圍:

  1. ${parameter^pattern}:將變量 parameter 值中第一個匹配的 pattern 轉換為大寫。

    示例:

    text="hello world"
    echo "${text^w}"  # 輸出 "Hello world",將第一個匹配的 "w" 轉換為大寫
    
  2. ${parameter^^pattern}:將變量 parameter 值中所有匹配的 pattern 轉換為大寫。

    示例:

    text="hello world"
    echo "${text^^o}"  # 輸出 "hellO wOrld",將所有匹配的 "o" 轉換為大寫
    
  3. ${parameter,pattern}:將變量 parameter 值中第一個匹配的 pattern 轉換為小寫。

    示例:

    text="Hello World"
    echo "${text,w}"  # 輸出 "hello World",將第一個匹配的 "W" 轉換為小寫
    
  4. ${parameter,,pattern}:將變量 parameter 值中所有匹配的 pattern 轉換為小寫。

    示例:

    text="Hello World"
    echo "${text,,o}"  # 輸出 "hellO WOrld",將所有匹配的 "o" 轉換為小寫
    

總結:

  • ${parameter^pattern}${parameter^^pattern} 用于將變量值中的匹配部分轉換為大寫,分別轉換第一個匹配和所有匹配。
  • ${parameter,pattern}${parameter,,pattern} 用于將變量值中的匹配部分轉換為小寫,分別轉換第一個匹配和所有匹配。

變量特定操作 ${parameter@operator}

操作取值:

U 全大寫
u 首字母大寫
L 全小寫
Q 轉義字符生成
E 轉義字符展開
P 提示符展開
A 變量名和值
K 數組變量名和值
a 屬性值
k 數組變量名和值

下面是每個操作的示例:

  1. ${parameter@U}:將變量 parameter 的值中的所有小寫字母轉換為大寫。

    示例:

    text="hello World"
    echo "${text@U}"  # 輸出 "HELLO WORLD"
    
  2. ${parameter@u}:將變量 parameter 的值中的第一個字母轉換為大寫。

    示例:

    text="hello world"
    echo "${text@u}"  # 輸出 "Hello world"
    
  3. ${parameter@L}:將變量 parameter 的值中的所有大寫字母轉換為小寫。

    示例:

    text="HELLO WORLD"
    echo "${text@L}"  # 輸出 "hello world"
    
  4. ${parameter@Q}:返回對變量 parameter 的值進行轉義后的結果,可以用作輸入。

    示例:

    text="Hello World"
    echo "${text@Q}"  # 輸出 "Hello\ World"
    
  5. ${parameter@E}:將變量 parameter 的值中的反斜杠轉義字符展開。

    示例:

    text="Hello\nWorld"
    echo "${text@E}"  # 輸出 "Hello
    World"
    
  6. ${parameter@P}:展開變量 parameter 的值,類似于 Bash 提示符展開。

    示例:

    text="Hello World \A"
    echo "${text@P}"  # 輸出 "Hello World 14:23"
    
  7. ${parameter@A}:返回一個賦值語句,將重建變量 parameter 的屬性和值。

    示例:

    text="Hello World"
    echo "${text@A}"  # 輸出 "text='Hello World'"
    
  8. ${parameter@K}:返回變量 parameter 的值,可能被引號引用,但數組的索引和關聯數組的鍵值對將被逐個展開并用引號引用。

    示例:

    array=("key1" "value1" "key2" "value2")
    echo "${array@K}"  # 輸出 "key1='value1' key2='value2'"
    
  9. ${parameter@a}:返回變量 parameter 的屬性值,表示為一系列標志。

    示例:

    text="Hello World"
    echo "${text@a}"  # 輸出 "-"
    

-:變量既沒有被引號引用,也不是數組。
q:變量被單引號引用。
Q:變量被雙引號引用。
x:變量是被解釋的。
X:變量是被不被解釋的。
@:變量是數組或者關聯數組。
A:變量是被賦值的(assigned)。

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

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

相關文章

感知機和神經網絡

引入 什么是神經網絡? 我們今天學習的神經網絡,不是人或動物的神經網絡,但是又是模仿人和動物的神經網絡而定制的神經系統,特別是大腦和神經中樞,定制的系統是一種數學模型或計算機模型,神經網絡由大量的人…

圖像處理:圖像噪聲添加

文章目錄 前言一、高斯噪聲二、椒鹽噪聲三、泊松噪聲四、斑點噪聲五、指數噪聲六、均勻噪聲總結 前言 本文主要介紹幾種添加圖像噪聲的方法,用于數據增強等操作。 以下圖為例。 一、高斯噪聲 高斯噪聲就是給圖片添加一個服從高斯分布的噪聲,可以通過調…

vLLM初探

vLLM是伯克利大學LMSYS組織開源的大語言模型高速推理框架,旨在極大地提升實時場景下的語言模型服務的吞吐與內存使用效率。vLLM是一個快速且易于使用的庫,用于 LLM 推理和服務,可以和HuggingFace 無縫集成。vLLM利用了全新的注意力算法「Page…

Python+PySpark數據計算

1、map算子 對RDD內的元素進行逐個處理,并返回一個新的RDD,可以使用lambda以及鏈式編程,簡化代碼。 注意:再python中的lambda只能有行,如果有多行,要寫成外部函數;(T)-&…

train_gpt2_fp32.cu - cudaCheck

源碼 // CUDA error checking void cudaCheck(cudaError_t error, const char *file, int line) {if (error ! cudaSuccess) {printf("[CUDA ERROR] at file %s:%d:\n%s\n", file, line,cudaGetErrorString(error));exit(EXIT_FAILURE);} }; 解釋 該函數用于檢查CU…

無人機路徑規劃:基于鯨魚優化算法WOA的復雜城市地形下無人機避障三維航跡規劃,可以修改障礙物及起始點(Matlab代碼)

一、部分代碼 close all clear clc rng(default); %% 載入數據 data.S[50,950,12]; %起點位置 橫坐標與縱坐標需為50的倍數 data.E[950,50,1]; %終點點位置 橫坐標與縱坐標需為50的倍數 data.Obstaclexlsread(data1.xls); data.numObstacleslength(data.Obstacle(:,1)); …

連接和斷開與服務器的連接

要連接到服務器,通常需要在調用mysql時提供一個MySQL用戶名,很可能還需要一個密碼。如果服務器在除了登錄的計算機之外的機器上運行,您還必須指定主機名。聯系您的管理員以找出應該使用哪些連接參數來連接(即使用哪個主機、用戶名…

TypeError: can only concatenate str (not “int“) to str

TypeError: can only concatenate str (not "int") to str a 窗前明月光,疑是地上霜。舉頭望明月,低頭思故鄉。 print(str_len len(str_text) : len(a)) 試圖打印出字符串 a 的長度,但是在 Python 中拼接字符串和整數需要使用字符…

【微服務】spring aop實現接口參數變更前后對比和日志記錄

目錄 一、前言 二、spring aop概述 2.1 什么是spring aop 2.2 spring aop特點 2.3 spring aop應用場景 三、spring aop處理通用日志場景 3.1 系統日志類型 3.2 微服務場景下通用日志記錄解決方案 3.2.1 手動記錄 3.2.2 異步隊列es 3.2.3 使用過濾器或攔截器 3.2.4 使…

triton編譯學習

一 流程 Triton-MLIR: 從DSL到PTX - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/671434808Superjomns blog | OpenAI/Triton MLIR 遷移工作簡介https://superjom

基于STM32單片機的環境監測系統設計與實現

基于STM32單片機的環境監測系統設計與實現 摘要 隨著環境污染和室內空氣質量問題的日益嚴重,環境監測系統的應用變得尤為重要。本文設計并實現了一種基于STM32單片機的環境監測系統,該系統能夠實時監測并顯示室內環境的溫濕度、甲醛濃度以及二氧化碳濃…

C語言題目:A+B for Input-Output Practice

題目描述 Your task is to calculate the sum of some integers 輸入格式 Input contains an integer N in the first line, and then N lines follow. Each line starts with a integer M, and then M integers follow in the same line 輸出格式 For each group of inpu…

Sass詳解

Sass(Syntactically Awesome Stylesheets)是一種CSS預處理器,它允許你使用變量、嵌套規則、混入(Mixin)、繼承等功能來編寫CSS,從而使CSS代碼更加簡潔、易于維護和擴展。下面是Sass的詳細解釋: …

【docker】容器優化:一行命令換源

原理: 根據清華源提供的Ubuntu 軟件倉庫進行sources.list替換 ubuntu | 鏡像站使用幫助 | 清華大學開源軟件鏡像站 | Tsinghua Open Source Mirror 1、換源 echo "">/etc/apt/sources.list \&& echo "# 默認注釋了源碼鏡像以提高 apt …

新iPadPro是怎樣成為蘋果史上最薄產品的|Meta發布AI廣告工具全家桶| “碾碎一切”,蘋果新廣告片引爭議|生成式AI,蘋果傾巢出動

Remini走紅背后:AI生圖會是第一個超級應用嗎?新iPadPro是怎樣成為蘋果史上最薄產品的生成式AI,蘋果傾巢出動Meta發布AI廣告工具全家桶,圖像文本一鍵生成解放打工人蘋果新iPadPro出貨量或達500萬臺,成中尺寸OLED發展關鍵…

8、QT——QLabel使用小記2

前言:記錄開發過程中QLabel的使用,持續更新ing... 開發平臺:Win10 64位 開發環境:Qt Creator 13.0.0 構建環境:Qt 5.15.2 MSVC2019 64位 一、基本屬性 技巧:對于Qlabel這類控件的屬性有一些共同的特點&am…

QToolButton的特殊使用

QToolButton的特殊使用 介紹通過QSS取消點擊時的凹陷效果點擊時的凹陷效果通過QSS取消點擊時的凹陷效果 介紹 該篇文章記錄QToolButton使用過程中的特殊用法。 通過QSS取消點擊時的凹陷效果 點擊時的凹陷效果 通過QSS取消點擊時的凹陷效果 #include <QToolButton> #i…

Dockerfile中的CMD和ENTRYPOINT

Shell格式和Exec格式 在Dockerfile中&#xff0c;RUN、CMD和ENTRYPOINT指令都可以使用兩種格式&#xff1a;Shell格式和Exec格式。 exec 格式&#xff1a;INSTRUCTION ["executable","param1","param2"] shell 格式&#xff1a; INSTRUCTION c…

【深耕 Python】Quantum Computing 量子計算機(5)量子物理概念(二)

寫在前面 往期量子計算機博客&#xff1a; 【深耕 Python】Quantum Computing 量子計算機&#xff08;1&#xff09;圖像繪制基礎 【深耕 Python】Quantum Computing 量子計算機&#xff08;2&#xff09;繪制電子運動平面波 【深耕 Python】Quantum Computing 量子計算機&…

ios 開發如何給項目安裝第三方庫,以websocket庫 SocketRocket 為例

1.brew 安裝 cococapods $ brew install cocoapods 2、找到xcode項目 的根目錄&#xff0c;如圖&#xff0c;在根目錄下創建Podfile 文件 3、在Podfile文件中寫入 platform :ios, 13.0 use_frameworks! target chat_app do pod SocketRocket end project ../chat_app.x…