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}
舉例說明:
這四種 ${}
形式的區別如下:
-
${parameter:-word}
:如果變量parameter
未定義或為空,則使用默認值word
,并將其擴展為該值;否則,保持變量var
的原始值。示例:
var="value" echo "${var:-default}" # 輸出 "value" unset var echo "${var:-default}" # 輸出 "default"
-
${parameter:=word}
:如果變量parameter
未定義或為空,則將其設置為默認值word
,并將其擴展為該值;否則,保持變量var
的原始值。示例:
var="value" echo "${var:=default}" # 輸出 "value" unset var echo "${var:=default}" # 輸出 "default"
-
${parameter:?word}
:如果變量parameter
未定義或為空,則輸出錯誤信息word
到標準錯誤輸出,并退出腳本;否則,將變量var
的值擴展為其原始值。示例:
var="value" echo "${var:?Variable var is not set.}" # 輸出 "value" unset var echo "${var:?Variable var is not set.}" # 輸出錯誤信息到標準錯誤輸出并退出腳本
-
${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 中的參數擴展形式,用于提取字符串的子串。它們的區別在于提取子串的方式:
-
${parameter:offset}
:從變量parameter
的字符串中提取從偏移量offset
開始的子串,直到字符串的末尾。示例:
str="abcdefg" echo "${str:2}" # 輸出 "cdefg",從位置 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 中的間接引用形式,用于引用以特定前綴開頭的變量名。它們的區別在于展開的方式和結果:
-
${!prefix*}
:展開以prefix
開頭的所有變量名,并返回由這些變量值組成的字符串列表,每個變量值之間用空格分隔。示例:
var1="value1" var2="value2" echo "${!var*}" # 輸出 "var1 var2"
-
${!prefix@}
:與${!prefix*}
類似,展開以prefix
開頭的所有變量名,并返回由這些變量值組成的字符串列表,每個變量值之間用空格分隔。示例:
var1="value1" var2="value2" echo "${!var@}" # 輸出 "var1 var2"
-
${!name[@]}
:展開數組name
中的所有元素,并返回由這些元素值組成的字符串列表,每個元素值之間用空格分隔。示例:
array=("value1" "value2") echo "${!array[@]}" # 輸出 "value1 value2"
-
${!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 中的模式刪除操作,用于從變量值中刪除匹配的部分。它們的區別在于匹配的方式和刪除的范圍:
-
${parameter#word}
:刪除變量parameter
值開頭匹配的最短部分(即最短匹配)。示例:
path="/path/to/file.txt" echo "${path#*/}" # 輸出 "path/to/file.txt",刪除第一個斜杠及其之前的部分
-
${parameter##word}
:刪除變量parameter
值開頭匹配的最長部分(即最長匹配)。示例:
path="/path/to/file.txt" echo "${path##*/}" # 輸出 "file.txt",刪除最后一個斜杠及其之前的部分
-
${parameter%word}
:刪除變量parameter
值結尾匹配的最短部分(即最短匹配)。示例:
filename="file.txt" echo "${filename%.*}" # 輸出 "file",刪除最后一個點及其之后的部分
-
${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 中的模式替換操作,用于在變量值中替換匹配的部分。它們的區別在于替換的范圍和方式:
-
${parameter/pattern/string}
:將變量parameter
值中第一個匹配的pattern
替換為string
。示例:
text="apple banana banana" echo "${text/ban/orange}" # 輸出 "apple orangeana banana",只替換第一個匹配的 "ban"
-
${parameter//pattern/string}
:將變量parameter
值中所有匹配的pattern
替換為string
。示例:
text="apple banana banana" echo "${text//ban/orange}" # 輸出 "apple orangeana orangeana",替換所有匹配的 "ban"
-
${parameter/#pattern/string}
:如果變量parameter
值以pattern
開頭,則將其替換為string
。示例:
filename="file.txt" echo "${filename/#file/path}" # 輸出 "path.txt",替換開頭的 "file"
-
${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 中的大小寫轉換操作,用于將變量值中匹配的部分進行大小寫轉換。它們的區別在于轉換的方式和范圍:
-
${parameter^pattern}
:將變量parameter
值中第一個匹配的pattern
轉換為大寫。示例:
text="hello world" echo "${text^w}" # 輸出 "Hello world",將第一個匹配的 "w" 轉換為大寫
-
${parameter^^pattern}
:將變量parameter
值中所有匹配的pattern
轉換為大寫。示例:
text="hello world" echo "${text^^o}" # 輸出 "hellO wOrld",將所有匹配的 "o" 轉換為大寫
-
${parameter,pattern}
:將變量parameter
值中第一個匹配的pattern
轉換為小寫。示例:
text="Hello World" echo "${text,w}" # 輸出 "hello World",將第一個匹配的 "W" 轉換為小寫
-
${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 數組變量名和值
下面是每個操作的示例:
-
${parameter@U}
:將變量parameter
的值中的所有小寫字母轉換為大寫。示例:
text="hello World" echo "${text@U}" # 輸出 "HELLO WORLD"
-
${parameter@u}
:將變量parameter
的值中的第一個字母轉換為大寫。示例:
text="hello world" echo "${text@u}" # 輸出 "Hello world"
-
${parameter@L}
:將變量parameter
的值中的所有大寫字母轉換為小寫。示例:
text="HELLO WORLD" echo "${text@L}" # 輸出 "hello world"
-
${parameter@Q}
:返回對變量parameter
的值進行轉義后的結果,可以用作輸入。示例:
text="Hello World" echo "${text@Q}" # 輸出 "Hello\ World"
-
${parameter@E}
:將變量parameter
的值中的反斜杠轉義字符展開。示例:
text="Hello\nWorld" echo "${text@E}" # 輸出 "Hello World"
-
${parameter@P}
:展開變量parameter
的值,類似于 Bash 提示符展開。示例:
text="Hello World \A" echo "${text@P}" # 輸出 "Hello World 14:23"
-
${parameter@A}
:返回一個賦值語句,將重建變量parameter
的屬性和值。示例:
text="Hello World" echo "${text@A}" # 輸出 "text='Hello World'"
-
${parameter@K}
:返回變量parameter
的值,可能被引號引用,但數組的索引和關聯數組的鍵值對將被逐個展開并用引號引用。示例:
array=("key1" "value1" "key2" "value2") echo "${array@K}" # 輸出 "key1='value1' key2='value2'"
-
${parameter@a}
:返回變量parameter
的屬性值,表示為一系列標志。示例:
text="Hello World" echo "${text@a}" # 輸出 "-"
-:變量既沒有被引號引用,也不是數組。
q:變量被單引號引用。
Q:變量被雙引號引用。
x:變量是被解釋的。
X:變量是被不被解釋的。
@:變量是數組或者關聯數組。
A:變量是被賦值的(assigned)。