アフィリエイト広告を利用しています

広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
posted by fanblog

2017年05月07日

キー番号の競合チェックが必要になったためシェルで。。 ・同一キー番号がリストにないかチェックし、なければリストに追加 ・同一キー番号がリストにないかチェックし、あればリストから削除

#================================================================
# ファイル名:kyougou_keyadd.sh
# 概要 :同一キー番号がリストにないかチェックし、なければリストに追加
# パラメータ:
# P1:キー番号
#================================================================

key_length=5

#---------------------------------------
#メイン処理ここから
#---------------------------------------

echo "同一キー番号がリストにないかチェックし、なければリストに追加します"

#---------------------------------------
#パラメータチェック
#---------------------------------------

#入力されたかチェック
if [ $# -eq 0 ]
then
echo "P1が指定されていません。"
return 1
fi

inputkey=$1

#文字数チェック
if [ ${#inputkey} -ne $key_length ]
then
echo "P1が5文字ではありません。"
return 1
fi

#数字かチェック

#P2に+1をし、その戻り値をRETに保存
expr $inputkey + 1 > /dev/null 2>&1
ret=$?

#戻り値を使って正常か異常かを判断
if [ ! $ret -lt 2 ]
then
echo "P1が数字ではありません。"
return 1
fi

#リストが存在するかチェック
if [ ! -e keychk_list ]; then
#リストなし
#リストにキー番号を追加
echo $inputkey >> keychk_list
echo "正常終了しました。"
return 0
fi

#リストあり
#リスト内に同一キー番号が存在するかチェック
if cat keychk_list | grep -q $inputkey
then
#同一キー番号あり
echo "$inputkey は既に登録されています。"
return 0
fi

#同一キー番号なし
#リストにキー番号を追加
echo $inputkey >> keychk_list
echo "正常終了しました。"

#正常終了
return 0



#================================================================
# ファイル名:kyougou_keydel.sh
# 概要 :同一キー番号がリストにないかチェックし、あればリストから削除
# パラメータ:
# P1:キー番号
#================================================================

key_length=5

#---------------------------------------
#メイン処理ここから
#---------------------------------------

echo "同一キー番号がリストにないかチェックし、あればリストから削除します"

#---------------------------------------
#パラメータチェック
#---------------------------------------

#入力されたかチェック
if [ $# -eq 0 ]
then
echo "P1が指定されていません。"
return 1
fi

inputkey=$1

#文字数チェック
if [ ${#inputkey} -ne $key_length ]
then
echo "P1が5文字ではありません。"
return 1
fi

#数字かチェック

#P2に+1をし、その戻り値をRETに保存
expr $inputkey + 1 > /dev/null 2>&1
ret=$?

#戻り値を使って正常か異常かを判断
if [ ! $ret -lt 2 ]
then
echo "P1が数字ではありません。"
return 1
fi

#リストが存在するかチェック
if [ ! -e keychk_list ]; then
#リストなし
echo "正常終了しました。"
return 0
fi

#リストあり
#リスト内に同一キー番号が存在するかチェック
if cat keychk_list | grep -q $inputkey
then
#同一キー番号あり
echo "削除対象あり。"
#cat keychk_list | sed -e "s/$inputkey//"
sed -i -e "/$inputkey/d" keychk_list
return 0
fi

#同一キー番号なし
echo "正常終了しました。"

#正常終了
return 0

久々のC言語1と同じのをシェルで実装してみると・・・

#====================================================================================
# ファイル名:calender_chk.sh
# 概要 :calenderファイルに従い、元号(年号/和暦)コードから元号文字を取得する
#
# カレンダーファイル
# H,h,4,1989/1/8
# S,s,3,1926/12/25
# T,t,2,1912/7/30
# M,m,1,1868/9/8
#
# パラメータ:
# P1:年号コード
#====================================================================================

key_length=1

#---------------------------------------
#メイン処理ここから
#---------------------------------------

echo "calenderファイルに従い、年号コードから年号文字を取得する"

#---------------------------------------
#パラメータチェック
#---------------------------------------

#入力されたかチェック
if [ $# -eq 0 ]
then
echo "P1が指定されていません。"
return 1
fi

nengou_code=$1

#文字数チェック
if [ ${#nengou_code} -ne $key_length ]
then
echo "P1が1文字ではありません。"
return 1
fi

#数字かチェック

#P2に+1をし、その戻り値をRETに保存
expr $nengou_code + 1 > /dev/null 2>&1
ret=$?

#戻り値を使って正常か異常かを判断
if [ ! $ret -lt 2 ]
then
echo "P1が数字ではありません。"
return 1
fi

#---------------------------------------
#
#---------------------------------------

#リストが存在するかチェック
if [ ! -e calender.txt ]; then
#リストなし
echo "カレンダーファイルがありません。"
return 1
fi

#リストあり
#リスト内に同一元号コードが存在するかチェック
for line in `cat calender.txt`
do
colmun1=`echo ${line} | cut -d ',' -f 1`
colmun2=`echo ${line} | cut -d ',' -f 2`
colmun3=`echo ${line} | cut -d ',' -f 3`
colmun4=`echo ${line} | cut -d ',' -f 4`

echo "項目1:${colmun1}"
echo "項目2:${colmun2}"
echo "項目3:${colmun3}"
echo "項目4:${colmun4}"
echo "行終了"

if [ $colmun3 = $nengou_code ]
then
echo "ヒットです。"
echo "項目2:${colmun2}"
return 0
fi
done

#異常終了
echo "ノーヒットです。"
return 1

久々のC言語1


/*
カレンダー情報を参照し、元号コードから元号文字を返す

calender.txt
H h 4 1989,1,8
S s 3 1926,12.25
T t 2 1912,7,30
M m 1 1868,9,8

*/
int gengou_str_get(int gengou_code, char *gengou_str)
{
typedef struct {
char gengou_oomoji[4];
char gengou_komoji[4];
int gengou_code;
char start_day[12];
}cale_t;

FILE *fp;
char *filename = "C:\\Study\\pleiades-e4.5-cpp-jre_20151002\\pleiades\\workspace\\C_Study_01\\src\\calender.txt";
cale_t cale_info;
cale_t *cale_info_p;

cale_info_p = &cale_info;

int ret;

/* ファイルのオープン */
if ((fp = fopen(filename, "r")) == NULL) {
fprintf(stderr, "%sのオープンに失敗しました.\n", filename);
return -1;
}

memset(cale_info_p, 0x00, sizeof(cale_t));
ret = -1;

/* ファイルの終端まで文字を読み取り表示する */
while( ( ret = fscanf( fp, "%s %s %d %s", cale_info_p->gengou_oomoji, cale_info_p->gengou_komoji, &(cale_info_p->gengou_code), cale_info_p->start_day ) ) != EOF ){
if (cale_info_p->gengou_code == gengou_code){
strncpy(gengou_str, cale_info_p->gengou_oomoji, sizeof(cale_info_p->gengou_oomoji));
printf("HIT!!\n");

/* ファイルのクローズ */
ret = 1;
break;
}

memset(cale_info_p, 0x00, sizeof(cale_t));
}
/* ファイルのクローズ */
fclose(fp);

return ret;
}

void TEST(void)
{
int now_gengou_code=3;
char gengou_str[4];
int ret;

memset(gengou_str, 0x00, sizeof(gengou_str));

#if 1
ret = gengou_str_get(now_gengou_code, gengou_str);
if(ret < 0){
printf("error gengou_str_get\n");
return;
}
printf("get %s\n", gengou_str);
#else
switch (now_gengou_code)
{
case 1:
printf("get M\n");
break;
case 2:
printf("get T\n");
break;
case 3:
printf("get S\n");
break;
case 4:
printf("get H\n");
break;
default:
printf("New\n");
break;
}
#endif
return;
}

2017年02月12日

シェルスクリプトです。 コマンドファイルを読み込んで順次コマンド実行するのですが コマンドファイル内に期待する実行結果などを記載し 自動で実行確認もしてくれるのを考えてました。(まだ色々問題はありそうですが)

#!/sbin/sh

#================================================================
# ファイル名:cmd_seqexec.sh
# 概要 :コマンドファイルの順次実行
# パラメータ:
# P1:コマンドファイル名
# P2:開始行数
# コマンドファイル形式:
# コマンド名,チェック(無/自動/対話),条件(一致/不一致),期待結果
#================================================================

#1ならdebugプリント出力
debug=0

#1なら全てのコマンド実行結果(標準出力)を出力する
#1以外なら対話確認の時だけ出力する
cmd_result_print=0

#初期化
gyou=0
cmd=""
cmd_start=0

#---------------------------------------
#デバックプリント関数
#---------------------------------------
debug_echo()
{
if [ $debug -eq 1 ]
then
echo "(debug)$debug_msg"
fi
}

#---------------------------------------
#エラープリント関数
#---------------------------------------
err_echo()
{
echo "コマンドファイルの順次実行が異常終了しました。"
echo "$err_msg"
if [ $cmd_start -eq 1 ]
then
echo "行数:$gyou コマンド名:$cmd"
fi
exit 0
}

#---------------------------------------
#コマンド実行関数
#---------------------------------------
func_cmd_exec()
{
#Noと現時刻を表示
echo "=================================================================="
echo ">>>行数:$gyou"
echo ">>>実行コマンド:$cmd"

#コマンド実行を行い、標準出力された内容を実行結果に設定する
cmd_result=$($cmd)

###cmd_result=$($cmd 2>&1) #標準出力、標準エラーの両方を変数に設定

if [ $cmd_result_print -eq 1 ]
then
echo ">>>実行結果:$cmd_result"
elif [ $chk = "対話" ]
then
echo ">>>実行結果:$cmd_result"
fi
}

#---------------------------------------
#対話確認関数
#---------------------------------------
func_taiwa()
{
while true
do
echo ">>>対話確認を行います。実行結果のok/ngを選択して下さい。:"
read answer
case $answer in
ok)
break
;;
ng)
err_msg="対話にてNGが選択されました。"; err_echo
;;
*)
;;
esac
done
}

#---------------------------------------
#メイン処理ここから
#---------------------------------------

#---------------------------------------
#パラメータチェック
#---------------------------------------

#入力されたかチェック
if [ $# -eq 0 ]
then
err_msg="第一パラメータでコマンドファイルが指定されていません。"; err_echo
fi

#ファイルが存在するかチェック
if [ ! -e $1 ]
then
err_msg="第一パラメータで指定されたファイルがありません。"; err_echo
fi

file=$1

if [ $# -eq 1 ]
then
err_msg="第2パラメータで開始行数が指定されていません。"; err_echo
fi

#数字かチェック

#P2に+1をし、その戻り値をRETに保存
expr $2 + 1 > /dev/null 2>&1
ret=$?

#戻り値を使って正常か異常かを判断
if [ ! $ret -lt 2 ]
then
err_msg="第2パラメータが数字ではありません。"; err_echo
fi

start_gyou=$2

#---------------------------------------
#コマンドファイルの順次実行
#---------------------------------------

gyou=1
cmd_start=1

while : #無限ループ
do
debug_msg="$gyou行目を処理します。"; debug_echo

if [ $gyou -lt $start_gyou ]
then
debug_msg="開始行数ではないのでパス"; debug_echo
gyou=$((gyou + 1))
continue
fi

#1行取得
line=$(sed -n ${gyou}P $file)

debug_msg="line=$line"; debug_echo

cmd=`echo "$line" | cut -d ',' -f 1`
chk=`echo "$line" | cut -d ',' -f 2`
jyouken=`echo "$line" | cut -d ',' -f 3`
expected_val=`echo "$line" | cut -d ',' -f 4`

debug_msg="1カラム目(コマンド):$cmd"; debug_echo
debug_msg="2カラム目(チャック):$chk"; debug_echo
debug_msg="3カラム目(条件  ):$jyouken"; debug_echo
debug_msg="4カラム目(期待結果):$expected_val"; debug_echo

if [ -z "$cmd" ]
then
debug_msg="コマンド未入力のためパス"; debug_echo
gyou=$((gyou + 1))
continue
fi

if [ $(echo "$cmd" | cut -c1) = "#" ]
then
debug_msg="コマンドの先頭文字が#のためスキップします。"; debug_echo
gyou=$((gyou + 1))
continue
fi

if [ "$cmd" = "end" ]
then
debug_msg="コマンドがendなので終了します。"; debug_echo
break
fi

case $chk in
"自動")
case $jyouken in
"一致")
if [ -z "$expected_val" ]
then
err_msg="コマンドファイルの期待結果が未入力です。"; err_echo
fi

#コマンド実行
func_cmd_exec

#期待結果と比較
if [ $cmd_result = $expected_val ]
then
echo ">>>自動チェック(一致):OK"
else
err_msg="自動チェックにてNGとなりました。"; err_echo
fi
;;
"含む")
if [ -z "$expected_val" ]
then
err_msg="コマンドファイルの期待結果が未入力です。"; err_echo
fi

#コマンド実行
func_cmd_exec

#期待結果と比較
if [ "$(echo "$cmd_result" | grep "$expected_val")" ]
then
echo ">>>自動チェック(含む):OK"
else
err_msg="自動チェックにてNGとなりました。"; err_echo
fi
;;
*)
err_msg="コマンドファイルの条件で一致/含む以外が指定されました。"; err_echo
;;
esac
;;

"対話")
#コマンド実行
func_cmd_exec

#対話確認関数
func_taiwa
;;

"無")
#コマンド実行
func_cmd_exec
;;
*)
err_msg="コマンドファイルのチェックで自動/対話/無以外が指定されました。"; err_echo
;;
esac

gyou=$((gyou + 1))

sleep 1
done

echo "コマンドファイルの順次実行が正常終了しました。"

#正常終了
exit 1

2017年01月28日

Teratermのマクロ作成。第2弾。 sqlplusでテーブル参照をし続けるマクロ。ちゃんと動きますよ。

;======================================================
;teratermマクロ
;sqlplusで接続して特定テーブル参照をし続けるマクロ
;
;参照するテーブルの検索キーは変数指定です。
;コマンドファイル実行前に、デフォルトで最初に実行したい
;コマンドも記載可能
;ログを自動で取得します。
;======================================================

;-----------------------------------------------------------
;初期設定
;-----------------------------------------------------------

;ログ自動保存
;ログ保存先
LOGSPATH = 'C:\test\log\'

;ログファイル名
getdate LOG_NAME 'teraterm(&h)_%Y%m%d_%H%M%S.log'

FULLPATH = LOGSPATH
strconcat FULLPATH LOG_NAME

;ログ取得開始
logopen FULLPATH 1 1

;タイトル設定
settitle 'sqlplusでテーブル参照をし続けるマクロ'

;プロンプト
wait_prompt = 'SQL>'

;ポーズタイム(s)
pause_time = 3

;参照するテーブルの検索キー
code_str = '> 300'
name_str = "like '%ナ%'" ;文字列に「'」を使用したいので「"」を使用した。

;-----------------------------------------------------------
;デフォルトで最初に実行したいコマンド
;-----------------------------------------------------------

default_input = 1 ;無ければ0にする

if default_input = 1 then
sendln 'date'
sendln 'whoami'
sendln 'hostname'
sendln 'pwd'
endif

;-----------------------------------------------------------
;sqlplusで接続し、初期設定
;-----------------------------------------------------------
sendln 'sqlplus xxx/xxx'
pause 1

sendln 'set linesize 3000'
pause 1

sendln 'set pages 100'
pause 1

;-----------------------------------------------------------
;テーブル参照し続ける
;-----------------------------------------------------------
;実行回数
count = 1

while 1
;10回毎に実行回数を表示する
if count % 10 = 0 then
;実行回数を表示する
int2str count_str count ;数値を文字に変換
sendln '###' count_str ' 回目を実行します ###'

;タイムスタンプ
sendln '!date'
pause 1

endif

;テーブル参照1
sendln 'select * from fruit where code ' code_str ' order by code;'

;プロンプト出力を待つ
wait wait_prompt

;指定時間ポーズする
pause pause_time

;テーブル参照2
sendln 'select * from fruit where name ' name_str ' order by code;'

;プロンプト出力を待つ
wait wait_prompt

;指定時間ポーズする
pause pause_time

count = count + 1
endwhile

:breakloop

;---END---

久々にTeratermのマクロを作成。 コマンドファイルを読み込んで順次実行するやつです。ちゃんと動きますよ。


以下、作ってみたプログラム

;======================================================
;teratermマクロ
;コマンドファイルを読み込み順次実行するマクロです。
;
;コマンドファイル順次実行時、プロンプト出力を待ってから
;次のコマンドを実行するか、 指定時間ポーズするかを選択できます。
;コマンドファイル実行前に、デフォルトで最初に実行したい
;コマンドも記載可能
;ログを自動で取得します。
;======================================================

;-----------------------------------------------------------
;初期設定
;-----------------------------------------------------------

;ログ自動保存
;ログ保存先
LOGSPATH = 'C:\test\log\'

;ログファイル名
getdate LOG_NAME 'teraterm(&h)_%Y%m%d_%H%M%S.log'

FULLPATH = LOGSPATH
strconcat FULLPATH LOG_NAME

;ログ取得開始
logopen FULLPATH 1 1

;タイトル設定
settitle 'コマンドファイルの順次実行マクロ'

;コマンドファイル
cmdfile = 'C:\test\loadcmd.txt'

;コマンドファイル順次実行時、プロンプト出力を待つか(1)
;指定時間ポーズするか(1以外)、どちらかを設定
wait_prompt_f = 0

;プロンプト
wait_prompt = '123'

;ポーズタイム(s)
pause_time = 1

;-----------------------------------------------------------
;デフォルトで最初に実行したいコマンド
;-----------------------------------------------------------

default_input = 1 ;無ければ0にする

if default_input = 1 then
sendln 'date'
sendln 'whoami'
sendln 'hostname'
sendln 'pwd'
endif

;-----------------------------------------------------------
;コマンドファイルの順次実行
;-----------------------------------------------------------
;ファイルオープン
fileopen fh cmdfile 0

;ファイル内の実行行数
count = 1

while 1
;コマンドファイルから1行読み込み
filereadln fh buf

;読み込めない時はループを抜ける
if result goto breakloop

;ファイル内の実行行数表示
int2str count_str count ;数値を文字に変換
sendln '### ' count_str ' 行目を実行します ###'

;コマンド実行
sendln buf

if wait_prompt_f = 1 then
;プロンプト出力を待つ
wait wait_prompt
else
;指定時間ポーズする
pause pause_time
endif

count = count + 1
endwhile

:breakloop

;ファイルクローズ
fileclose fh

sendln '#マクロ正常終了

;---END---

2017年01月01日

初投稿。初心を忘れずに・・・頑張りたいと思います。

システムエンジニアとして、日々仕事をしながら色々な事を学んでおりますが
せっかく覚えた技術も別のプロジェクトに移ったり、使用する機会が減ると
あっという間に忘れてしまうものです。
せっかく覚えた事ですので、思い出しやすいように技術ノートを作ってみました。
また、何事も経験と思いながらもブログ、WEBページ作成などをした事がなかったため
今回初めての投稿となります。これから徐々に技術ノートを作成していきたいと思います。
(=´ー`)ノ ヨロシク
ファン
検索
<< 2017年05月 >>
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
最新記事
写真ギャラリー
最新コメント
タグクラウド
カテゴリーアーカイブ
月別アーカイブ
プロフィール
日別アーカイブ
×

この広告は30日以上新しい記事の更新がないブログに表示されております。