Bash script 有關 ${} 字串截取的常用參數

由於前篇「FFmpeg 批次影片轉檔」當中,命令行使用到 ${} 變數替換暨字串截取參數功能,在此紀錄一下,以備後用。

  • 範例:以指定位數截取字串
    命令:${字串: 起始位:截取到幾位},若位數為負值,則是倒數;執行結果在下一行

定義變數值:
string = 12345abcde甲乙丙丁戊
${string} 全字串
12345abcde甲乙丙丁戊
${#string} 字串長度(中文字亦視為 1 )
15
${string: 7} 第 7 位取到最末
cde甲乙丙丁戊
${tring: 7:0} 第 7 位取到 0 個(空值)

${string: 7:2} 第 7 位取到 2 個
cd
${string: 7:-2} 第 7 位取到 -2 個(倒數 2 位不取)
cde甲乙丙
${string: -7} 倒數第 7 位取到最末
de甲乙丙丁戊
${string: -7:0} 倒數第 7 位取到 0 個(空值)

${string: -7:2} 倒數第 7 位取到 2 個
de
${string: -7:-2} 倒數第 7 位取到 -2 個(倒數 2 位不取)
de甲乙丙

  • 範例:以符號截取字串
    用到三個符號: # $ %,分別位在標準鍵盤數字 3 4 5 上方。
    $:代表變數; # 代表自左比對,因為 # 在 $ 左方; % 代表自右比對,因為 % 在 $ 右方
    #:代表刪去左方最小匹配
    ##:代表刪去左方最大匹配
    %:代表刪去右方最小匹配
    %%:代表刪去右方最大匹配

定義全路徑檔案變數:
f = /home/lookart/dir01/dir02/dir03/Just_for_test.txt
${f} 全字串
/home/lookart/dir01/dir02/dir03/Just_for_test.txt
${#f} 字串長度
49
${f#*/} 刪去左方起算第一個 / 及其左字串,注意 * 在 / 左方
home/lookart/dir01/dir02/dir03/Just_for_test.txt
${f##*/} 刪去左方起算最後一個 / 及其左字串(最大匹配,只留檔案名)
Just_for_test.txt
${f%/*} 刪去右方起算第一個 / 及其右字串(只留路徑),注意 * 在 / 右方
/home/lookart/dir01/dir02/dir03
${f%%/*} 刪去右方起算最後一個 / 及其右字串(最大匹配,故成空值)

${f##*.} 取得副檔名
txt

  • 範例:文字替換
    /字串1/字串2:以字串2替換比對符合的第一個字串1
    //字串1/字串2:以字串2替換比對符合的全部字串1

${f/_/-} 替換第一個 _ 為 –
/home/lookart/dir01/dir02/dir03/Just-for_test.txt
${f//_/-} 替換全部 _ 為 –
/home/lookart/dir01/dir02/dir03/Just-for-test.txt
${f/.txt/.dat} 替換第一個 .txt 為 .dat(變更副檔名)
/home/lookart/dir01/dir02/dir03/Just_for_test.dat
d=${f%/*} ; echo ${d##*/} 只要第三層目錄名稱,可以這樣用:先去掉檔名,再去掉左方目錄名
dir03
d=${f%.*} ; echo ${d##*_} 只要檔名末四字,可以這樣用:先去掉 .及右方的副檔名,再去掉 _ 及左方全部字串
test
d=`echo ${f: -8:4}` ; echo ${d} 當然也可以上面截取字串的方法這樣做
test

註:有關 Bash 操作暨參數控制相關詳情見【Bash參考手冊】原文解說。


於 GNU bash,版本 4.4.23(1)-release (x86_64-suse-linux-gnu) 下執行。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *