Bashスクリプトでデータベースを作る (その4)- 検索画面

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


 これだけで、データベースの基本的な機能は実現できました。

後は、見やすいように、好みに応じて表示に色を付けたりと、コードを修正してください。

このデータベースの課題は、なんて言ってもデータの修正機能の実装ですが、これが実現できなくても、正しいデータを追記しておけばなんとかなります。こんなことはデータの型の柔軟性がこんなところにも生きています。

コメント

タイトルとURLをコピーしました