Bashシェルスクリプトで変数からパターンに合致した文字列を除去する(dirname、basenameの代替として利用可能)

2021-05-20Bash,Linux

はじめに

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

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

検証環境

$ uname -moi
x86_64 x86_64 GNU/Linux

$ head -n 2 /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"

$ bash -version | head -n 1
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)

コマンド

$ FILEPATH=/opt/groovy/bin/groovy

$ echo ${FILEPATH#*/}
opt/groovy/bin/groovy

# === basenameと一緒 ===
$ echo ${FILEPATH##*/}
groovy

# === dirnameと一緒 ===
$ echo ${FILEPATH%/*}
/opt/groovy/bin

# 何も表示されない
$ echo ${FILEPATH%%/*}

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

ひとこと

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

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

2021-05-20Bash,Linux