Linux 的 bash shell 提供了多種形式的參數擴展表達式,能夠獲取變量自身的值,或者對變量值進行特定處理獲得一個新的值,等等。
本篇文章對字符串變量值相關的參數擴展表達式進行彙總說明。shell
假設在 bash 中定義了 filepath=example/subdir/testfile.txt
這樣一個變量,能夠使用下面的參數擴展來獲取一些值:bash
-
${filepath}
獲取 filepath 變量的值。
例如,echo ${filepath} 命令打印的結果是 example/subdir/testfile.txt。
-
${#filepath}
獲取到 filepath 變量值的字符個數,也就是字符串長度。
例如,echo ${#filepath} 命令打印的結果是 27。
-
${filepath:4:3}
從 filepath 變量值開頭的第 4 個字符開始,日後獲取三個字符,獲得一個子字符串。
例如,echo ${filepath:4:3}
命令打印的結果是 ple。
注意是從開頭的第 0 個字符開始數起。
這個表達式的格式是 ${parameter:offset:length},offset 指定從哪一個位置開始獲取字符,length 指定獲取多少個字符。
-
${filepath: -3:3}
從 filepath 變量值倒數的第 3 個字符開始,日後獲取三個字符,獲得一個子字符串。
例如,echo ${filepath: -3:3} 命令打印的結果是 txt。
負數的 offset 表示倒數的偏移值。冒號和負號之間要加空格。
注意是從末尾的第 1 個字符開始往前數。
-
${filepath#*/}
在 filepath 變量值中,從頭開始匹配所給的 */
這個模式,刪除第一個匹配的模式,返回後面剩餘的內容。
這裏用 *
通配符來匹配開頭的任意字符串。
例如,echo ${filepath#*/}
打印的結果是 subdir/testfile.txt。
這個表達式的格式是 ${parameter#word}
,從 parameter 變量值中刪除最短匹配 word 的前綴部分。
-
${filepath##*/}
在 filepath 變量值中,從頭開始匹配所給的 */
這個模式,一直刪除到最後一個匹配的模式,返回後面剩餘的內容。
這裏用 *
通配符來匹配開頭的任意字符串。
例如,echo ${filepath##*/}
打印的結果是 testfile.txt。
這個表達式的格式是 ${parameter##word},從 parameter 變量值中刪除最長匹配 word 的前綴部分。
-
${filepath%/*}
在 filepath 變量值中,從末尾往前匹配所給的 /*
這個模式,刪除第一個匹配的模式,返回前面剩餘的內容。
這裏用 *
通配符來匹配末尾的任意字符串。
例如,echo ${filepath%/*}
打印的結果是 example/subdir。
這個表達式的格式是 ${parameter%word},從 parameter 變量值中刪除最短匹配 word 的後綴部分。
-
${filepath%%/*}
在 filepath 變量值中,從末尾往前匹配所給的 /*
這個模式,一直刪除到最後一個匹配的模式,返回前面剩餘的內容。
這裏用 *
通配符來匹配末尾的任意字符串。
例如,echo ${filepath%%/*}
打印的結果是 example。
這個表達式的格式是 ${parameter%%word},從 parameter 變量值中刪除最長匹配 word 的後綴部分。
-
${filepath/[et]/M}
在 filepath 變量值中,把第一個匹配的小寫字母 e、或者小寫字母 t,替換成大寫字母 M。
這裏用 [et]
路徑名擴展來匹配小寫字母 e、或者小寫字母 t。
這個表達式的格式是 ${parameter/pattern/string}
,把匹配 pattern 的字符串替換成 string 字符串。
只替換第一個匹配的模式字符串。這個模式字符串能夠位於變量值的開頭、中間、以及末尾部分。
例如,echo ${filepath/[et]/M} 打印的結果是 Mxample/subdir/testfile.txt。
-
${filepath//[et]/M}
在 filepath 變量值中,把全部匹配的小寫字母 e、或者小寫字母 t,替換成大寫字母 M。
這裏用 [et]
擴展來匹配小寫字母 e、或者小寫字母 t。
讓 pattern 模式字符串以字符 ‘/’ 開頭,表示替換全部匹配的字符串。
例如,echo ${filepath//[et]/M} 打印的結果是 MxamplM/subdir/MMsMfilM.MxM。
-
${filepath/subdir}
在 filepath 變量值中,刪除匹配的 subdir 字符串。
例如,echo ${filepath/subdir}
打印的結果是 example//testfile.txt。
這個表達式沒有提供替換以後的字符串,表示刪除所匹配的字符串。
${parameter#word}
只能刪除匹配的前綴。${parameter%word}
只能刪除匹配的後綴。
而 ${parameter/pattern} 能夠刪除任意位置的匹配字符串,包括中間位置。
-
${filepath^^}
把 filepath 變量值的全部字符都轉換爲大寫。
例如,echo ${filepath^^}
打印的結果是 EXAMPLE/SUBDIR/TESTFILE.TXT。
這個表達式的格式是 ${parameter^^pattern},把 parameter 變量值中匹配 pattern 模式的每個小寫字母都轉成大寫。
若是沒有提供 pattern 模式,表示匹配任意一個字符。
-
${filepath,,}
把 filepath 變量值的全部字符都轉換爲小寫。
例如,echo ${filepath,,}
打印的結果是 example/subdir/testfile.txt。
這個表達式的格式是 ${parameter,,pattern},把 parameter 變量值中匹配 pattern 模式的每個大寫字母都轉成小寫。
若是沒有提供 pattern 模式,表示匹配任意一個字符。
-
${filepath^}
把 filepath 變量值的首字符轉成大寫。
例如,echo ${filepath^}
打印的結果是 Example/subdir/testfile.txt。
這個表達式的格式是 ${parameter^pattern},把匹配 pattern 模式的 parameter 變量值首字符轉成大寫。
若是沒有提供 pattern 模式,表示匹配任意單個字符。
-
${filepath,}
把 filepath 變量值的首字符轉成小寫。
例如,echo ${filepath,}
打印的結果是 example/subdir/testfile.txt。
這個表達式的格式是 ${parameter,pattern},把匹配 pattern 模式的 parameter 變量值首字符轉成小寫。
若是沒有提供 pattern 模式,表示匹配任意單個字符。
上面內容彙總說明了多個字符串變量值相關的擴展表達式,方便統一收藏查閱。測試
關於這些擴展表達式的詳細說明、以及更多的測試例子,能夠查看我前面三篇以 「Bash技巧:使用參數擴展」 開頭的文章。code