簡単な対話型データ入力(3)

 main.sh の中で日付設定が終わった後、取得されたシェル変数をexport して edit_id.sh が実行されます。

 前半はシェル変数の引継ぎに成功しているか確認しています。IDの入力シーケンスでは再び while ループの登場です。

 IDを入力します。そのIDがデータベース${DB}のテーブル${table}に登録されていれば、そのレコードのchフィールドを表示し、思っているものと一致するか確認を促します。yまたはYが入力され、入力したIDが所望のものである確認がとれれば insert_db.sh を実行してループの最初に戻ります。一方、タイプミスなどの理由から所望のIDでなかった場合はnまたはNが入力されますので何もせずにループの最初に戻ります。一方、yでもnでもなかった場合は、確認のループを再度実行して、y or n を聞いてきます。

 一方、入力したIDがデータベースに登録されていなかった場合、else分岐に移りますから、e または E という文字であった場合、whileループを抜けてスクリプトを終了して main.sh へ戻ります。タイプミスなどの理由から、IDがそれ以外の文字であった場合はループの最初に戻って、再びIDの入力を促します。

#! /bin/bash
# シェル変数の引継ぎ確認
error_num=0
for var in date keyword input_date
do
 if [ -z ${!var} ]
  then
   printf "[%s] 関数 %s の変数 ${var} に値がありません\n" \
    "`date +"%F %T"`" `basename $0`
   error_num=`expr ${error_num} + 1`
 fi
done
printf "[%s] 関数 %s のエラーは%d回です\n" \
    "`date +"%F %T"`" `basename $0` ${error_num}
if [ ${error_num} -ne 0 ]; then exit; fi

# IDの入力シーケンス
while :
do
  nonewline "IDを入力して下さい(終了はe) "
  read ID
  ch=`mysql -N -h ${host} ${DB} << _SQL_
   select ch from ${table} where id="${ID}";
_SQL_`
  if [ ! -z ${ch} ]
  then
   printf "%s\n" ${ch}
   while :
   do
   nonewline "これでいいですか?[y/n] "
   read RESP
   char=`echo $RESP | cut -c1`
   case $char in
    y|Y)
        export id=${ID}
        ./insert_db.sh
        break
        ;;
    n|N) break;;
    ?)  ;;
   esac
   done
  else
    case ${ID} in
      e|E) break;;
      ?) ;;
    esac
  fi
done

400記事達成しました

第400回を記念して、第300回から前回までの記事へのリンクテーブルを掲載します。

 

投稿年月日 タイトル
399 2024年02月17日 簡単な対話型データ入力(2)
398 2024年02月16日 簡単な対話型データ入力(1)
397 2024年02月15日 炊き込み御飯のおにぎり
396 2024年01月24日 鶏肉とキャベツの煮物
395 2023年12月30日 台北旅行~第3天~
394 2023年12月29日 台北旅行~第2天~
393 2023年12月24日 台北旅行~第1天~
392 2023年12月02日 QRコードのピクセル数
391 2023年11月04日 鳥肝の生姜煮
390 2023年10月28日 仏壇のお飾り
389 2023年09月30日 蛋黄月饼
388 2023年09月24日 音読さん
387 2023年09月02日 発生し続ける汚染水
386 2023年09月01日 トリチウム
385 2023年08月30日 AIの定義とは
384 2023年08月16日 令和5年台風7号
383 2023年07月23日 「紙芝居動画」の作成
382 2023年07月21日 出梅了
381 2023年07月02日 動画用画像ファイルをHTMLから作成する
380 2023年06月25日 タスクログの単純化
379 2023年06月04日 温泉旅行
378 2023年06月03日 リモートログイン
377 2023年06月02日 気象レーダー
376 2023年03月23日 世界棒球经典赛
375 2023年03月03日 白血病让伟大的医生变成了一个自私的孩子吗?
374 2023年02月26日 静止画と音声ファイルの結合
373 2023年02月20日 YOUTUBEに動画をアップする
372 2023年02月19日 酢レンコン
371 2023年02月10日 謎の円筒形降水帯
370 2023年01月26日 2023年1月大寒波
369 2023年01月22日 2023年的春节
368 2023年01月14日 舞茸
367 2023年01月09日 mplayerのキー操作
366 2022年12月31日 2022年の大晦日
365 2022年12月25日 テンプレートの作成
364 2022年12月03日 長崎旅行
363 2022年11月24日 三役そろい踏み
362 2022年11月23日 こんな人居るんだ?
361 2022年11月20日 SCILABで音声ファイルを切断する
360 2022年11月17日 JR三ノ宮駅西改札口
359 2022年11月13日 気象サイト
358 2022年10月28日 HSK4级考试
357 2022年10月22日 mp3形式音声ファイルの再生時間取得
356 2022年09月24日 2022年秋のお彼岸
355 2022年09月11日 FileZillaのppk変換がうまくゆかない
354 2022年08月26日 お盆三が日の御膳
353 2022年08月12日 キクラゲの煮物
352 2022年07月31日 盂兰盆
351 2022年07月24日 煮豆
350 2022年07月18日 中国語教科書のインデックス(全体)
349 2022年07月10日 神户旅行(继续)
348 2022年07月09日 欢迎神户,欢迎青森
347 2022年06月14日 恥ずかしい日本語
346 2022年06月12日 みんな大好きカレーライス
345 2022年06月04日 HiNativeのスクレイピング
344 2022年05月08日 鶏炊き込み御飯
343 2022年05月07日 sedを用いたtag_remover
342 2022年05月04日 日本国憲法75歳
341 2022年04月23日 22日
340 2022年03月27日 番茄炒鸡蛋
339 2022年03月26日 MYSQLのプレイリスト三度
338 2022年03月18日 キャベツとツナ缶の煮物
337 2022年03月13日 中国の民主化について
336 2022年03月10日 伍仁月饼
335 2022年02月26日 GMTver6によるウクライナ周辺地図
334 2022年02月21日 一起向未来
333 2022年02月11日 炒り鶏
332 2022年01月29日 立春
331 2022年01月16日 Evacuateでいいの?
330 2022年01月10日 防人の島
329 2022年01月02日 中国語教科書のインデックス(その1)
328 2021年12月31日 2021年大晦日
327 2021年12月30日 中国語で長さの単位
326 2021年12月16日 あさりのスープ
325 2021年12月04日 大根のなます
324 2021年11月27日 termuxでタスクログ
323 2021年11月23日 「語学学習」考
322 2021年11月19日 月食
321 2021年11月13日 緯度・経度の概算距離
320 2021年11月12日 滋賀・岐阜ドライブ
319 2021年11月03日 シェル変数の引継ぎを確認する
318 2021年10月30日 28ヶ月半のタダ働き
317 2021年10月29日 柿の白和え
316 2021年10月07日 柿の追い熟
315 2021年09月26日 ウサギとカメ
314 2021年09月18日 豆乳と豆腐
313 2021年08月21日 GMTver6で中国行政界を描く
312 2021年07月30日 冬瓜の煮物
311 2021年07月29日 緯度経度から2地点間の距離を計算する
310 2021年07月18日 金閣寺
309 2021年07月15日 ワクチン
308 2021年07月04日 医薬品
307 2021年06月13日 Ubuntsuでのフォントの設定
306 2021年06月06日 Googleの読み上げ機能を利用して音声ファイルを作る
305 2021年05月28日 2021年の小梅
304 2021年05月23日 上書きしないようファイル名を連番で変更する
303 2021年05月08日 GMTver6で日本語表示
302 2021年05月05日 リストファイルから配列の作成(訂正)
301 2021年05月02日 リストファイルから配列の作成
300 2021年04月29日 300記事達成しました

簡単な対話型データ入力(2)

日付設定シーケンスの中身を担うdateset.shについてです。

やはり whileループを回しています。日付を6桁の整数で要求されますが、これは既存のデータベースの形式と整合させるためです。データベースのホスト名他詳細は${host_name}などとして秘匿しています。テーブル中に入力した日付が存在すればシェル変数${file}に値が入ります。

その場合、if文の分岐で真の側に進み、keyword,date,input_dateなどの変数を作成することになります。最後にbreak文でループを抜け、main.shへ戻ります。ちなみに、このdateset.shはmain.shの中でカレントシェルとして実行していますので、dateset.sh中で作成したkeyword,date,input_dateなどの変数の値はmain.shへ引き継がれます。

#! /bin/bash

 while :
 do
  nonewline "授業の日を6桁の数字で入力して下さい "
  read RESP
  file=`mysql -N -h ${host_name} ${db_name} << _SQL_
   select file from ${table_name} where file like "${RESP}%";
_SQL_`
  if [ ! -z ${file} ]
  then
   YY=`echo ${file} | cut -c1-2`
   MM=`echo ${file} | cut -c3-4`
   DD=`echo ${file} | cut -c5-6`
   keyword="20${YY}-${MM}-${DD}"
   date=${YY}${MM}${DD}
   nonewline "リスニング日を6桁の数字で入力して下さい "
   read RESP
   YY=`echo ${RESP} | cut -c1-2`
   MM=`echo ${RESP} | cut -c3-4`
   DD=`echo ${RESP} | cut -c5-6`
   input_date="20${YY}-${MM}-${DD}"
   break
  else
   printf "その日付は存在しません\n"
  fi
 done
    

簡単な対話型データ入力(1)

whileループとcase分岐により、誤った入力をしても異常終了しない(しにくい)データ入力スクリプトを作成してみました。

1文字目がdまたはDで始まる文字列を入力すると、日付設定シーケンスへ分岐されます。同様にeまたEで始まる文字列を入力すると、終了シーケンスへ分岐されます。

日付設定を選択すると同じディレクトリ内のdataset.shが実行され、変数${date}に値が入ります。その値に応じて特定のディレクトリのHTML文書が表示され、かつedit_id.shへと引き継がれます。

一方、終了を選択すれば終了します。

それ以外のキーを打ってしまった場合は「もう一度お願いします」と表示されてループの最初に戻ります。

#! /bin/bash

 while :
 do
  printf "D/d) 日付設定 E/e)終了\n"
  nonewline " "
  read RESP
  char=`echo $RESP | cut -c1`
  case $char in
# 日付設定のシーケンス
   d|D) 
    . ./dateset.sh 
    firefox ./印刷用HTML/${date}raw.html &
    export keyword=${keyword} 
    export date=${date} 
    export input_date=${input_date}
    ./edit_id.sh
     ;;

# 終了のシーケンス
   e|E)
   kill -9 `pgrep firefox`
   break
   ;;

# それ以外
   ?) echo "もう一度お願いします" ;;
  esac
 done

dateset.shやedit_id.shの中でも同様のループを利用して重層的な構造となっていますので、今後数回にわたって紹介して行きます。

炊き込み御飯のおにぎり

弁当用に素早くできる炊き込み御飯を取り合えず作ってみました。

 

具材 備考
1合  
にんじん 15グラム A
ごぼう 15グラム A
しょうが 5グラム A
薄揚げ 半枚 A
醤油 大さじ1  
大さじ1  
150CC  

 

材料Aは千切りにしておきます。

水は醤油と酒の分、減らしておきました。

 

鶏肉とキャベツの煮物

キャベツを消費する為に作ってみました。



具材 備考
鶏もも肉 180グラム  
キャベツ 120グラム  
玉ねぎ 50グラム 約1/4個
大さじ1  
小さじ1/2  
400cc  
しょうゆ 適量 A
にんにく 適量 A
しょうが 適量 A

 

鶏肉は1口大に、キャベツは千切り、玉ねぎはスライスにして、酒・塩・水とともに圧力鍋で5分間加熱しておきます。

食べる直前にAのしょうゆ・にんにく・しょうがで味を整えながら、温め直します。

今日は今シーズン一番の寒波到来です。あったかいスープで温まりましょう。

台北旅行~第3天~

 

2日目 にして漸くエンジンが掛かってきた台北旅行でしたが、初めて知った海外旅行の豆知識を、ここで披露します。

まず、海外でスマホを使うには購入時に WORLD WING という契約が必要です。また通話料・SMS料金は意外と高いです。例えばSMSだと1通送るごとに100円、通話は着信した場合でも1分あたり145円必要でした。あと道を調べるためにグーグルマップを使いたいといった用途が有ると思いますが、アプリをダウンロードしておいてローミング機能を使用することになります。この時、3日間分のギガを購入すると時間当たりの単価は割安になるのですが、スマホを全く使用しない深夜なども料金が掛かることとなります。私は1時間利用を8回購入しました。購入した1時間のうちに1度しかデータ通信をしなかった事も有りましたが、一応2日連続で購入したよりも安価となった計算です。この辺りは使用方法に応じて使い分けるのが良いでしょう。

ところで公共交通機関を利用するには悠游卡と呼ばれる交通カードが便利という話は 前々回 しましたが、カードに現金をチャージするに当たってはMRTの駅構内にある自動チャージ機が使えるのですが、おつりが出ないそうです。つまり、うっかり1000ドル札を入れたら1000ドルまるまるチャージされてしまうため、オプショナルツアーのガイドさんがNT$100に両替してチャージの仕方を教えてくれました。

あとスマホの万歩計アプリは、日本出国後は全くカウントされていませんでした。アプリの種類にもよるのかも知れませんが、どういう理屈なのか不明です。

さて、第3日目の朝食はホテル近くのマクドナルドで摂りました。日本でも朝マックメニューにあるソーセージマフィンセット(ホットコーヒーとハッシュポテト付き)で、95ドルでした。ここ2年間程は円安が驚異的に進行しているため、日本円にして約500円と少し割高に感じました。

 

朝食から戻った後、ホテルのフロントに頼んで日本へ荷物を送ることにしました。海外から荷物を送るのは今回の旅の目的の一つでしたが、やはり思った通り大変でした。

まず用意してくれた段ボール箱が140サイズのものです。こんなの東京から大阪まで送るだけでも2000円以上掛かってしまいます。ハサミかカッターナイフでも有れば加工して小さなサイズに出来たのかも知れませんが、結局、台北の空気を大量に運ぶこととなってしまいました。

また、内容物を詳細に尋ねられました。危険物が入っていたら問題となるのは勿論なのですが、全く合法な品物でも海外からの輸送は輸出入に当たってしまう可能性が有るということに、後で気が付きました。

さらに送り状も自身では書かせてもらえませんでした。私が指定した送り先を地図ソフトで詳細に住所確認した後、ホテル従業員自らタイピングして作成してくれました。おそらく手書きだとEMSが受け取ってくれないんでしょうね。

といった具合に、海外から荷物を送るのは一苦労です。だからこそ、海外からの旅行客の皆さんは大きなスーツケースを引きづって歩いているんでしょうね。次からは十分に準備を整えてから送ることにしようと思います。せめて適切な梱包資材を入手する算段くらいは付けておいた方がいいですね。

 

さて荷物を預けたらホテルをチェックアウトして台北车站駅に向かいました。日本の新幹線に相当する高铁にも乗ってみたかったのですが、万が一トラブルが有った場合、飛行機の搭乗手続きに差し支えると思い今回は見送りました。しかし、高铁は台湾島全体の大動脈だからでしょうか、広大なコンコースには色んな国からの旅行客が至る所で座り込んでおり、非常に活気がありました。ぜひ次回は高铁の旅も楽しんでみたいと思います。

 

さて高铁乗車を諦めて、公園路を南に向かうと行政の中心部に至ります。日本の霞が関周辺もそうですが、道路幅が広くて横断歩道が少ないため地上を歩くと苦労します。MRTの淡水信义线と松山新店线が交差する中正纪念堂駅の構内を移動して中正纪念堂へ向かいました。大理石でできた巨大なお城のような建物の4階に飾られているのは蒋中正の銅像です。蒋中正は日本では蒋介石という呼び名の方が通りが良いかもしれません。20世紀後半の一時期、台湾では神格化されていた人物だったそうです。白亜の城の中で大陸の方角を見詰めながら鎮座する蒋介石像の胸の内に有るのは、もはや郷愁だけのように思えてなりませんでした。

 

離陸時刻の2時間半前を目途に台湾桃园机场に到着しました。チェックインは無人カウンターで可能なのですが、パスポートをスキャンし航空券番号を入力した後、Eメールアドレスを要求された事に一揉めしました。係員と話してみたら、次の画面に進んで携帯電話番号を入力するのでも構わないという事だったので一件落着です。

空港内をうろつこうとも思ったのですが、広すぎて何だかわからないため早々に保安検査を受けて制限区域内に入りました。制限区域内にも売店はたくさん有り、店員さんと意気投合したため、余ったドルを使うために最後のお土産を買いました。また自動販売機では悠游卡での支払いも可能だったため、残ったチャージも減らすことができました。この辺り関西空港よりも、ずいぶん親切ですね。

 

帰りのフライトは約2時間半です。機内食は、カレーライス・パン・サラダ・フルーツ・スィーツでした。地球の自転に沿っての飛行のため、あっと言う間に太陽が沈んでしまったのが印象的でした。途中、日本の税関書類が配布されたのですが、読んでみてビックリ、荷物を送った人は「別送品有り」というカテゴリーに分類されて申告書を2枚書かないといけないのです。税関で「通関手続き」とか「課税通知書の送付」とか書かれた紙を手渡され、本当に荷物が家に届くのかビクビクしながら帰宅したのでした。

ちなみに荷物は本人に送れる事4日、12月14日午前中に台北の空気を大量に詰め込んで無事自宅に到着したのでした。

 

今回の旅行は天候をはじめ、さまざまな幸運に恵まれ、達成感に包まれたまま帰国することが出来ました。今後は中国語のスキルにより磨きをかけ、更なる海外旅行上手を目指したいものです。