シェルでは $0 で実行したスクリプトファイルのパスが取れる。ここでスクリプトのファイル名やスクリプトのあるディレクトリパスを切り出したときはどうすればよいか。basename というコマンドを使うとファイル名切り出せる。ただ bash だとパターンマッチ抽出たどコマンドに頼らずできる。

スクリプトのファイル名

1
2
3
4
5
6
7
#!/bin/bash

basefilename=${0##*/}
echo $basefilename

basefilenamewithoutext ${basefilename%%.*} # 拡張子を除く
echo $basefilenamewithoutext
  • ## は先頭の最長マッチ部分を削除する
  • %% は末尾の最長マッチ部分を削除する

スクリプトのディレクトリパス

1
2
3
4
5
6
#!/bin/bash

basedir=${0%/*}
echo $basedir

cd $basedir # スクリプトのあるディレクトリに移動する
  • % は末尾の最短マッチ部分を削除する
  • /foo.sh だと空文字列になってしまうのでがルートに置かれるスクリプトには使えない