3.検索画面のスクリプト
#!/usr/bin/bash
export GREP_COLORS="mt=1;37"
clear
DIR=/home/$USER/diary
DATA_FILE=/$DIR/work.txt
function serchwords
{
echo -e '[\e[33;01;47mSerch・Modify Data\e[0m]'
# AND検索に対応するために入力形式を例として表示しています。正規表現なんて覚えられない(笑)
echo '[AND検索書式]------------------------------------------'
echo 'スタートの検索文字列.*終わりの検索文字列'
echo '項目の順に並べること。文字列が1個でも可能 '
echo '-------------------------------------------------------'
# 検索後の入力を待ちます。
read -p $'[\e[33m検索語入力\e[0m]' words;
# 検索語が入力されないままENTERされた場合の処理
# $words が空であれば真が返され、常にread文が実行される
while [ -z "$words" ]
do
read -p $'[\e[31m入力なし。検索語再入力\e[0m]' words;
done
# grepで戻り値を取得するための実行。
# 変数に無理やり結果を入れて、画面に表示されないようにしている。
anser=`grep $words "$DATA_FILE" `
# grepの戻り値が0(一致した)の場合は検索結果を表示
# 1(一致しなかった)の場合は該当なしの表示
# パイプ処理、sort コマンドで日付ごとの昇順に並べ替え。予定などには便利と思われた。
if [ $? -eq 0 ]; then
echo -e '\e[35m検索結果-------------------------\e[0m'
grep -n --text --color=always $words "$DATA_FILE" | sort -k 2,2 -t " "
echo -e '\e[35m---------------------------------\e[0m'
else
echo -e '\e[35m検索結果-------------------------\e[0m'
echo '該当なし'
echo -e '\e[35m---------------------------------\e[0m'
fi
}
function eventmodify
{
echo -e '\e[33m------------------------------\e[0m'
read -p $'\e[33m|\e[0m修正する行(半角数字入力) \e[33m|\e[0m' line;
read -p $'\e[33m|\e[0m計画 結果 アイデア 疑問 etc.\e[33m|\e[0m' plan;
read -p $'\e[33m|\e[0m日付 ?月上中下旬 etc. \e[33m|\e[0m' date;
read -p $'\e[33m|\e[0mオブジェクト 作業 製品 etc. \e[33m|\e[0m' objects;
read -p $'\e[33m|\e[0m内 容 etc. \e[33m|\e[0m' contents;
read -p $'\e[33m|\e[0m備 考 etc. \e[33m|\e[0m' remarks;
echo -e '\e[33m------------------------------\e[0m'
if [ -z $date ];then
date=`date +%Y/%m/%d`
fi
# ここで行番号を元に、各項目に入力された変数の値をデータファイルに置換していきます
sed -i.bak -e ''$line'c\'$plan' '$date' '$objects' '$contents' '$remarks'' "$DATA_FILE"
}
function eventdel
{
echo -e '\e[33m------------------------------\e[0m'
read -p $'\e[33m|\e[0m削除する行(半角数字入力) \e[33m|\e[0m' line;
read -p $'\e[33m|\e[0m確認しますので、もう一度入力 \e[33m|\e[0m' lines;
echo -e '\e[33m------------------------------\e[0m'
if [ "$line" -eq "$lines" ]
then
sed -i.bak -e ''$line'd' "$DATA_FILE"
else
echo -e '\e[31m入力された値が異なりますので、処理を中断\e[0m'
serchwords
fi
}
function eventinput
{
cal -3
echo -e '\e[32m------------------------------\e[0m'
read -p $'\e[32m|\e[0m計画 結果 アイデア 疑問 etc.\e[32m|\e[0m' plan;
read -p $'\e[32m|\e[0m日付 ?月上中下旬 etc. \e[32m|\e[0m' date;
read -p $'\e[32m|\e[0mオブジェクト 作業 製品 etc. \e[32m|\e[0m' objects;
read -p $'\e[32m|\e[0m内 容 etc. \e[32m|\e[0m' contents;
read -p $'\e[32m|\e[0m備 考 etc. \e[32m|\e[0m' remarks;
echo -e '\e[32m------------------------------\e[0m'
if [ -z $date ];then
date=`date +%Y/%m/%d`
fi
echo $plan $date $objects $contents $remarks >> "$DATA_FILE"
}
# 1回目の検索を実行します。
serchwords
# 終了後は「続けて検索するか」を表示して入力を待ちます。
while read -p $'[ \e[32my:検索\e[0m | \e[32mn:中止\e[0m | \e[32mm:修正\e[0m | \e[32md:削除\e[0m | \e[32m1:入力\e[0m ]' choices;
do
case $choices in
'y')
# y が入力されると 再びserchwordsコマンドを実行します。
serchwords
;;
'm')
eventmodify
;;
'd')
eventdel
;;
'1')
eventinput
;;
'n') echo -e '\e[32m終了\e[0m'
# n が入力されるとこのプロセスが終了するため、親プロセスであるmenu.shに戻ります。
exit 0
;;
*) echo -e '\e[31m誤入力. 再試行\e[0m'
# その他の入力では「誤入力。再入力」と表示して、先頭のwhile文を実行します。
;;
esac
done
これだけで、データベースの基本的な機能は実現できました。
後は、見やすいように、好みに応じて表示に色を付けたりと、コードを修正してください。
このデータベースの課題は、なんて言ってもデータの修正機能の実装ですが、これが実現できなくても、正しいデータを追記しておけばなんとかなります。こんなことはデータの型の柔軟性がこんなところにも生きています。
コメント