シェルスクリプトを書いていると、ファイル名を含むパス文字列から、ファイル名や、ディレクトリ名、拡張子の部分のみを抽出したいケースによく遭遇します。
このページでは、これらの文字列の抽出方法について説明します。
ファイル名を含むパス文字列から、ファイル名や、ディレクトリ名、拡張子の部分のみを抽出するのは、かなり容易です。
早速サンプルをご紹介します。
#!/bin/sh test_path="/usr/local/etc/apache/httpd.conf" string_filename=${test_path##*/} string_filename_without_extension=${string_filename%.*} string_path=${test_path%/*} string_extension=${test_path##*.} echo ${string_filename} echo ${string_filename_without_extension} echo ${string_path} echo ${string_extension}
この実行結果は以下の通りです。
httpd.conf httpd /usr/local/etc/apache conf
何でこれで動くのか、納得がいかない方向けに説明すると、「${test_path##*/}」は「*/」で表される文字列の最長一致接頭部分の除去を、「${test_path%/*}」は「/*」で表される最短一致接尾部分の除去をするからです。
元の文字列「${test_path}」が「/usr/local/etc/apache/httpd.conf」ですので、「${test_path##*/}」では「*/」にマッチする最長の接頭部分「/usr/local/etc/apache/」が削除され、結果として「httpd.conf」が残ります。
また、「${test_path%/*}」は「/*」にマッチする最短の接尾部分「/httpd.conf」が削除され、結果として「/usr/local/etc/apache」が残ります。
詳しくは「sh」のmanをご確認ください。
・頂いたメッセージは管理者のチェックの後、公開されます。
・メッセージの公開を希望されない場合には、「このメッセージを非公開にする」にチェックを入れてください。
・管理者が不適切と判断したメッセージは公開しませんので、予めご了承ください。
まさにこれだ 7 (58%) |
ちょっと違う 3 (25%) |
これじゃない 2 (17%) |
表示できるメッセージはありません。