Bashシェルスクリプトで変数からパターンに合致した文字列を除去する(dirname、basenameの代替として利用可能)
はじめに
いつも前方から除去するのか、後方から除去するのかごっちゃになっています ^^;
たとえばファイルのフルパスからファイル名だけを取得する場合。 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}
で、 後方一致 になる。 %
だと貪欲でない(最短一致)検索、 %%
だと貪欲な検索が行われる。
ひとこと
覚えにくいですが、以下のように覚えると良いです。
#
はコメントアウトでよく使われるため前方一致、 %
は除算に使われるため後方一致。
ディスカッション
コメント一覧
まだ、コメントがありません