シェルスクリプトでファイル名を取得して使用する場合も多くあります。
そんな時どうすれば良いのかを記事にしました。
またエラーが出た時の体験や、ディレクトリのみ取得したりと付加価値のある記事にしました。
windowsのプロンプトで使用できるbatやpythonやphpを使用して、業務効率化やWebサイトを作成しております。javaやシェルスクリプトなど、様々なプログラミングを行った実績ありの筆者です。
実行した結果も詳しく載せているので、この記事を読めばシェルスクリプトでファイル名を取得する方法が簡単に理解できます。
シェルスクリプトで変数からファイル名を取得する方法!

ファイルを取得する方法は複数あります。
主に以下の方法があります。
- 「${変数##*/}」でファイル名取得する
- 「basename」コマンドでファイル名を取得する
変数から一部を抽出してファイル名を取得する

下のシェルスクリプトを記述します。
#!/bin/bash
file="/var/log/test1"
echo ${file##*/}
変数から一部を抽出してファイル名を取得するコード説明
「file」という変数に絶対パスで「test1」というファイルを入れています。
変数の一部を取得してファイル名だけを表示したい時は、「${file##*/}」を使用します。それをechoコマンドで表示しています。


つまりディレクトリは省いてファイル名のみ取得してくれます。
変数から一部を抽出してファイル名を取得するスクリプトを、実行した結果は以下となりました。
[root@localhost workspace]# bash get-filename.sh
test1
シェルスクリプトを実行する方法の詳細は、以下の記事を参考にしてください。
変数から一部を抽出するその他のシェルスクリプト
変数の一部を取得するその他のコードを以下にまとめておきます。
シェルスクリプト | 最〇一致 | どこから探すか |
---|---|---|
${変数##*/} | 最長一致 | 前から「/」を探す |
${変数#*/} | 最短一致 | 前から「/」を探す |
${変数%%/*} | 最長一致 | 後ろから「/」を探す |
${変数%/*} | 最短一致 | 後ろから「/」を探す |
${変数#文字列} | 最短一致 | 文字列以降が展開 |

変数から一部を抽出してディレクトリのみ取得する
これの応用でファイル名ではなくディレクトリのみ取得してみましょう。
#!/bin/bash
file="/var/log/test1"
echo ${file%/*}
上のシェルスクリプトを記述して実行して見ます。
[root@localhost workspace]# bash get-directory.sh
/var/log
ディレクトリのみ取得出来ています。
変数から一部を抽出してファイル名を取得する時のエラー実体験
ファイル名を取得する時にエラーがでた事があったので紹介しておきます。
以下のコードでシェルスクリプトを実行してみます。
#!/bin/bash
file="/var/log/test1"
echo ${file##/*}
実行した結果は以下となりました。
[root@localhost workspace]# bash get-filename_error.sh
/var/log/test1
ファイル名が取得できていません。
よく見ると「${file##/*}」になっています。正解は「${file##*/}」です。
「ディレクトリ/ファイル名」の構造になっている為「/*」でファイル名が取得できると思っていましたが逆でした。
「basename」コマンドでファイル名を取得する

「basename」コマンドでファイル名を取得するコードを、以下の様に記述します。
#!/bin/bash
file="/var/log/test1"
echo $(basename $file)
「basename」コマンドでファイル名を取得するコードの説明
同じく変数に絶対パスでファイル名を指定しています。
「$()」とする事で、カッコの中のコマンドの実行結果を表示する事ができます。
カッコの中に「basename」コマンドと引数の変数を入れています。
「basename」コマンドでファイル名を取得するシェルスクリプトを実行すると、以下の結果となりました。
[root@localhost workspace]# bash get-filename.sh
test1
結果同じくファイル名の「test1」を取得できました。
コマンドでディレクトリのみ取得する
同じくコマンドでディレクトリのみ取得してみます。
以下のシェルスクリプトを記述して実行してみます。
#!/bin/bash
file="/var/log/test1"
echo $(dirname $file)
結果は以下となりました。
[root@localhost workspace]# bash get-directory-dirname.sh
/var/log
「var/log」とディレクトリのみ取得する事が出来ました。
シェルスクリプトで変数からファイル名を取得する方法!まとめ

シェルスクリプトで絶対パスのファイル名のみ取得する方法は以下の方法があります。
- 「${変数##*/}」でファイル名取得する
- 「basename」コマンドでファイル名を取得する
ちなみにシェルスクリプトを実行しているファイル名を参照する時は「$0」を使用します。
変数の箇所を「$0」にすれば同じ事が可能です。