変数からパターンに合致した文字列を除去する

Bash, Linux

いつも前方から除去するのか、後方から除去するのかごっちゃになっている。

たとえばファイルのフルパスからファイル名だけを取得する場合。 basenameコマンドやdirnameコマンドを使えば解決なのだが、これらを使わない場合。

$ filepath=/opt/groovy/bin/groovy
$ echo ${filepath##*/}
groovy
$ echo ${filepath%/*}
/opt/groovy/bin

${変数名##pattern} で、 前方一致 でパターンにマッチした文字列を除去した結果を取得できる。 # だと貪欲でない検索、 ## だと貪欲な検索が行われる。
逆に ${変数名%%pattern} で、 後方一致 になる。 % だと貪欲でない検索、 %% だと貪欲な検索が行われる。

覚え方

覚えにくいが、以下のように覚えると良い。

# はコメントアウトでよく使われるため前方一致、 % は除算に使われるため後方一致。

Bash, Linux

Posted by genzouw