Bash技巧:實例介紹數個參數擴展表達式以處理字符串變量

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

相關文章
相關標籤/搜索