シェルで変数に格納された文字列を変更しようと思ったら、最初に思いつくのはSubString
や正規表現などですが、そんな事をしなくても簡単に末尾から任意の文字を削除できる事を最近知ったのでメモっておきます。
ファイル名に日付を追加する
以下の例では、ファイル名の末尾、つまりファイル名と拡張子の間に現在の日付を追加するサンプルです。
BASE_NAME="Sample.log"
FILE_NAME=${BASE_NAME%.*}_`date "+%Y%m%d "`${BASE_NAME#${BASE_NAME%.*}}
echo FILE_NAME
# 実行結果
# Sample_20201122.log
こちらのサイトを参考にさせていただきました。
シェル変数の末尾の文字を削除する シェルスクリプトを書く際、変数の末尾についた余分な記号を取りたいとき、以下のように行っていた(以下、"bananapencilbook"という文字列から"book"を削除する)。OSはCentOS、シェルはbashです。 $ echo ${... シェル変数の末尾の文字を削除する - 何でも屋エンジニアのブログ - 何でも屋エンジニアのブログ |
解説
上記の例では、先頭の「${BASE_NAME%.*}
」で後ろから検索(後方一致)して最初の「.(ドット)」までを除去して出力。
次に、「_`date "+%Y%m%d "
」で「_(アンダーバー)」と日付を追加。
最後に、「${BASE_NAME#${BASE_NAME%.*}
」で拡張子のみを末尾に付加しています。
まとめると、こんな感じ。
${BASE_NAME%.*}
→ Sample
_`date "+%Y%m%d "
→ _20201122
${BASE_NAME#${BASE_NAME%.*}
→.log
【結果】
Sample + _20201122 + .log
拡張子をワイルドカードで「*(アスタリスク)」にしたのは、どんな拡張子が来ても対応できるようにです。
その他にも、シェルの変数展開について詳しく書かれた記事がありましたので、こちらをご参考ください。
こちらも blog からの転載。シェルスクリプトを作成する際にシェル変数に値を代入したり参照したりする事は頻繁に発生するが、 シェル変数の展開にも便利な使い方がある。*basename* (1) や *dirname* (1) ... シェルの変数展開 - Qiita - Qiita |
- Original:https://minory.org/shell-variable-extension.html
- Source:Minory
- Author:管理者