bash スクリプト 日付一覧を生成
次のようなファイルをbashスクリプトで作ってみました。
ファイルの中身は、日記の日付。日記は月毎にファイルしています。1日から末日までを一日一行で、当該年月分を一ファイルとして生成。
日記は2004年頃から付けており、当時はHP200LX・vzエディターを使用。vzにあったカンレンダーマクロの書式を継承。
例えば、2024年9月の書式
* 2024.09.01(Sun) bp
* 2024.09.02(Mon) bp
.
.
.
* 2024.09.30(Mon) bp
を
d2409.org
に出力します。
今使用しているエディターは、emacs・orgモード。* は、markdown記法によるタイトル行、最後のBPは血圧。この二項はemacsで書き始めた時から追加した項目。
処理の目的は、bashで
./スクリプト名 yy mm
に対し
dyymm.org
を生成すること。
今までは、手動でやってきましたが、スクリプト化してみました。
OSXとwin11・wls2を作りました。OSXはdateコマンドをgdateに書き換えるだけです(gdateのインストが必要)。
作成にあたってのポイント
1.既存ファイルへの上書き禁止。折角書いた日記を、年月の入力ミスでリセットしまうリスクを回避。
2.月の日数取得はcalとawkで対応、閏年処理はcalにおまかせ。
以下、スクリプト(win11・wls2)です。
#!/bin/bash
LANG=C
year=$1
month=$2
month2=$(printf "%02d\n" "$month") #月を二桁表記 file名をyymmにするため
year4=$((2000+$year)) #西暦を4桁表記 calパラメータに必要
# 当該月の最終日をdaysに格納
days=$(cal $month $year4 | awk 'NF {days=$NF};END{print days}')
# ダイヤリー名 dyymm.org をnameに格納 emacs orgモード
name=d$year$month2".org"
# 上書き防止策 dyymm.orgのファイルが存在していれば、file生成はしない
if [ -f ./$name ]
then
echo "${name} は存在します。"
else
# dyymm.org を生成
touch $name
# 一行目におまじないを記入
# こうしておかないとOSX orgモードではfileオープン時に展開されてしまうため
echo "#+STARTUP: fold">$name
# 本体 入力した年(西暦下二桁)月の一行一日のdiaryを生成
for day in `seq 1 $days`;do date -d $year4/$month/$day +"* %Y.%m.%d(%a) bp ";done >> $name
# 生成diaryの中身確認
cat $name
fi