Bash

bashの変数内文字列置換まとめ

パターン 動作 典型的な使用例
${変数#パターン} 文字列先頭最短マッチ部分を削除 単に先頭の固定文字列を削除するとき使う
${変数##パターン} 文字列先頭最長マッチ部分を削除 ${HOGE##*/}でbasename
${変数%パターン} 文字列末尾最短マッチ部分を削除 ${HOGE%/*}でdirname。単に末尾の固定文字列を削除するときにも使う
${変数%%パターン} 文字列末尾最長マッチ部分を削除 あまり使わない
${変数/検索文字列/置換文字列} 最初にマッチしたもののみ文字列を置換
${変数//検索文字列/置換文字列} 全ての文字列を置換 ${HOGE//foo/bar}

#%が覚えづらい。
#はmarkdownで行頭に書くと見出しになるから「先頭の」
%100%のように末尾に書くから「末尾の」
と覚えるといいかも。

% %% # ## はPOSIXで決まっているのでbash以外でも使えるらしい。2.6.2 Parameter Expansionに書いてある。
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html

具体例

dirname

HOGE="/var/log/httpd/access.log"
echo ${HOGE%/*}    #=> /var/log/httpd

ただし$HOGEが1個も/を含まない場合はうまくいかないので注意:

HOGE="moge.txt"
echo ${HOGE%/*}    #=> moge.txt(本来は「.」になってほしい)

/を含むかどうか判定するにはこのようにすればよい:

mydirname() {
    if [[ $1 == */* ]]; then
        echo ${1##*/}
    else
        echo "."
    fi
}

basename

HOGE="/var/log/httpd/access.log"
echo ${HOGE##*/}    #=> access.log
HOGE="moge.txt"
echo ${HOGE##*/}    #=> moge.txt

拡張子を取得

HOGE="/var/log/httpd/access.log"
echo ${HOGE##*.}    #=> log
HOGE="moge.txt"
echo ${HOGE##*.}    #=> txt

ただしHOGEがピリオドを1個も含まない場合は元の文字列全体になってしまうので注意:

HOGE="/var/log/httpd/access"
echo ${HOGE##*.}    #=> /var/log/httpd/access

拡張子を削除

HOGE="/var/log/httpd/access.log"
echo ${HOGE%.*}    #=> /var/log/httpd/access
HOGE="moge.txt"
echo ${HOGE%.*}    #=> moge