シェルスクリプトを書いていて、
・パス文字列からディレクトリ部分だけを取得したい
・パス文字列からファイル名だけを取得したい
といったことは良くある。その方法を見ていこう。
パス文字列からディレクトリ部を取得する
・方法1 dirnameコマンドを使う
STR=/home/zawata/filename echo $(dirname ${STR})
結果:/home/zawata
dirnameコマンドを使い、渡された文字列のディレクトリ部を取得するやり方である。
・方法2 パラメータ展開を使う
STR=/home/zawata/filename echo ${STR%/*}
結果:/home/zawata
${parameter%word}と書くと、指定されたパラメータから
『wordのパターンに最短で後方一致する部分』を削除した値を得ることができる。
ここではwordに「/*」を指定しているので、パス文字列のうち、ファイル名部分がマッチする。
/home/zawata/filename ←赤文字部分がマッチし、削除される。
このようにすることで、ディレクトリ部を取得できる。
パス文字列からファイル名を取得する
・方法1 basenameコマンドを使う
STR=/home/zawata/filename echo $(basename ${STR})
結果:filename
basenameコマンドを使い、渡された文字列のファイル名を取得できる。
・方法2 パラメータ展開を使う
STR=/home/zawata/filename echo ${STR##*/}
結果:filename
${parameter##word}と書くと、指定されたパラメータから
『wordのパターンに最長で前方一致する部分』を削除した値を得ることができる。
ここではwordに「*/」を指定しているので、パス文字列のうち、ディレクトリ部分がマッチする。
/home/zawata/filename ←赤文字部分がマッチし、削除される。
このようにすることで、ファイル名を取得できる。
まとめ
以上をまとめたスクリプトを示す。
#!/bin/bash STR="/home/zawata/filename" # パス文字列からディレクトリ部を取得する # 方法1. dirnameコマンドを使う echo $(dirname ${STR}) # 方法2. パラメータ展開を使う echo ${STR%/*} # パス文字列からファイル名を取得する # 方法1. basenameコマンドを使う echo $(basename ${STR}) # 方法2. パラメータ展開を使う echo ${STR##*/}
結果:
/home/zawata
/home/zawata
filename
filename
補足 パラメータ展開の覚え方
パラメータ展開の書き方は、記号の種類と数が色々とあってややこしい。
今回出てきたパラメータ展開の書き方に限っては、こんな風に覚えておくといいかもしれない。
・${parameter%word}の覚え方
パーセント記号はキーボード上で見ると「右側」にある。1つだけなので「短い」。
だから、「右側から最短で一致したパターン」を削除する。
・${parameter##word}の覚え方
シャープ記号はキーボード上で見ると「左側」にある。2つあるので「長い」。
だから、「左側から最長で一致したパターン」を削除する。
初めまして。
シェルスクリプト、勉強させていただきます。
ピンバック: パスの取り扱い [Bash] – Site-Builder.wiki