BASH取得目錄名, 檔案名及副檔名及參數抽換功能

指令取得檔案名稱
basename /etc/sysconfig/network   #會得到檔案名稱network

指令取得目錄名稱
dirname /etc/sysconfig/network     #會得到路徑 /etc/sysconfig

取得檔案路徑中的檔名和副檔名
FILENAME=$(basename "${path}")
EXTENSION="${FILENAME##*.}"
FILENANE_WITHOUT_EXT="${FILENAME%.*}"

關於上面這個用法是Bash Parameter Substitution的功能

${parameter##pattern}是從前端開始移除符合pattern的最長內容
所以符合*.的意義就是檔案路徑與名稱到點的部分都要移除,因此只剩下副檔名。
${parameter%pattern}是從尾端開始移除符合pattern的最短內容
所以符合.*的意義就是點與副檔名的部分要被移除掉,因此只剩下檔名的部分。

長短的部分對於pattern中沒有*的時候,%表示移除最後一個符合的內容,而#表示移除最前一個符合的內容。
$ FILE=".tar.gz.xcache-1.3.0.tar.gz"
$ echo ${FILE%.tar.gz}
.tar.gz.xcache-1.3.0
$ echo ${FILE#.tar.gz}
.xcache-1.3.0.tar.gz
$ echo ${FILE##.tar.gz}
.xcache-1.3.0.tar.gz
$ echo ${FILE%%.tar.gz}
.tar.gz.xcache-1.3.0

應用這個功能就能快速完成轉換副檔名的工作

for f in *.bin
do 
    mv "${f}" "${f%%bin}txt"
done

衍伸的相關用法可以參考下面這些網站
1. Advanced Bash-Scripting Guide:Chapter 10. Manipulating Variables
2. HowTo: Use Bash Parameter Substitution Like A Pro
3. Bash Reference Manual 3.5.3 Shell Parameter Expansion

像是BASH預設參數功能
var=${parameter:-defaultValue}

或是參數不存在時顯示錯誤訊息的功能
var=${parameter?Error Message}

取參數的子字串
var=${parameter:offset}
var=${parameter:offset:length}
範例:
$ string=01234567890abcdefgh
$ echo ${string:7}
7890abcdefgh
$ echo ${string:7:0}

$ echo ${string:7:2}
78
$ echo ${string:7:-2}
7890abcdef
$ echo ${string: -7}
bcdefgh
$ echo ${string: -7:0}

$ echo ${string: -7:2}
bc
$ echo ${string: -7:-2}
bcdef

取得字串長度
echo ${#parameter}

取代功能
${paramter/pattern/string}
是取代第一個符合pattern的部分成為string

${paramter//pattern/string}
是取代所有符合pattern的部分成為string

留言