• 締切済み

シェルスクリプト:入力した日付のチェック

BourneShell勉強中の初心者のものです。 ユーザーが(yyyy-mm-dd)の形式で入力した日付に対して、日付が指定されたフォーマットにあいかつ範囲以内であることチェックして、次のステップに進みます。 1月から12月まで毎月31日まであるものとみなし、1000年から9999年までが範囲内です。 以下のようなスクリプトを書いたのですが、もう少し短くすっきりとできないでしょうか?何か他に方法があればご教授お願いします。 echo "日付を入力してください(yyyy-mm-dd):\c" read hiduke case $hiduke in [1-9][[0-9][0-9][0-9]-0[1-9]-0[1-9]) break ;; [1-9][[0-9][0-9][0-9]-1[0-2]-0[1-9]) break ;; [1-9][[0-9][0-9][0-9]-0[1-9]-[1-2][0-9]) break ;; [1-9][[0-9][0-9][0-9]-1[0-2]-[1-2][0-9]) break ;; [1-9][[0-9][0-9][0-9]-0[1-9]-3[01]) break ;; [1-9][[0-9][0-9][0-9]-1[0-2]-3[31]) break ;; "") echo "入力されていません" ;; *) echo "指定外です" ;; esac

みんなの回答

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.2

#1です。 参考に示したスクリプトは日付けとして正しくないものを与えたとき、まずいですね。 if test "$hiduke" = "`date '+%Y-%m-%d' -d "$hiduke" 2>/dev/null`" then echo OK else echo NG fi もしくは hiduke2=`date '+%Y-%m-%d' -d "$hiduke" 2>/dev/null` if test "$hiduke" = "$hiduke2" ...

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

そういう条件だと上記で十分シンプルだと思います。 date コマンドを使うと実在する日で無いとチェックできませんし、9999年まではサポートして無いと思います。 実在する日でよければ、 if test "$hiduke" = `date '+%Y-%m-%d' -d "$hiduke"` then echo OK else echo NG fi でいけると思います。今手元に環境が無いので未テストです。

関連するQ&A

  • 日付型の入力値チェック

    こんにちは。 下記のようなフォーマットで日付型のチェックをしたいと 思っています。最低限(1)YYYYが入力されていればOKで、 最高だと(8)YYYY-MM-DDThh:mm:ss.sTZDまで入力可能です。 この日付が妥当であれるかどうかの判定はどのように するのが良いでしょうか? YYYY[-MM[-DD[Thh[:mm[:ss[.s[TZD]]]]]]] (1)YYYY (2)YYYY-MM (3)YYYY-MM-DD (4)YYYY-MM-DDThh (5)YYYY-MM-DDThh:mm (6)YYYY-MM-DDThh:mm:ss (7)YYYY-MM-DDThh:mm:ss.s (8)YYYY-MM-DDThh:mm:ss.sTZD ちょっと考えたのは、まず、長さを見て各文字列を パースして各場所の数値の妥当性をチェックって 言うものです。これでも出来そうな気もしますが、 他にも良いやり方などありましたら、 ご教示宜しくお願い致します。

    • ベストアンサー
    • Java
  • EXCEL 日付の入力形式

    こんにちは。 日付が、dd/mm/yyyyの形式で入力されたデータをもらいました。 関数を利用したいのでEXCELに日付として認識させたいのですが、 セルの書式設定で設定してもだめなようです。 質問 1)yyyy/mm/ddの形式で入力されていないと日付として認識されないのでしょうか? 2)現在の形式のまま、日付として認識させる方法はありますか? 3)dd/mm/yyyyをyyyy/mm/ddに変換する方法はありますか? 以上、よろしくお願いします。

  • Excel97の日付の書式設定

    現在Excel97で日付入力をしたいのですが、 最終的に演算に使用する日付で yyyy/mm/ddとyyyy/mmどちらでも入力できる書式設定を探しています。 yyyy/mm/ddの指定にするとyyyy/mmと入力してもyyyy/mm/01となってしまいます。 yyyy/mmのセルとdd専用のセルを別に作ると、ddを入力した時に 閏年のエラーチェックなどがかけられないので演算部分(1年後該当日前日の指定等)がうまく働きません。 いい方法がありましたら教えてください。

  • 日付入力

    テキストボックスにYYYY/MM/DDの形式で入力します。 入力中に、YYYYが入力されたら自動的にスラッシュを付け加えて、またMMと入力したらスラッシュが自動的に入るようにしたいです。その過程で、日付のチェックも同時に行ないたいです。 どう書けばよいのでしょうか。ぜひ教えてください。お願いします。

  • 日付の入力チェック

    お疲れ様です。 c++の日付の入力型のチェックを行いたいです。 具体的には文字が入力されて その型が(yyyy/mm/dd)の型で存在するかをチェックします。 数字だけの入力なら標準クラスにありそうなのですが「/」を含みチェックは行えないのでしょうか? また標準クラスにあるのならば「try~catch」を使用してエラーを受け取れる方法があったら教えてください。 お願いします。

  • VBスクリプトで指定したコマンドで日付を取得するには?

    お世話になります。 VBスクリプトがうまく設定できなくて困っています。 下記は日付取得までです。 rem #***************************************** Option Explicit dim w_date rem #***************************************** rem # STEP01 パラメータチェック rem #***************************************** IF WScript.Arguments.Count = 0 then WScript.Echo "Parameter_No" WScript.Quit 99 End IF IF IsNumeric(WScript.Arguments.Item(0)) = False then WScript.Echo "Numeric_Check_Error" WScript.Quit 99 End IF rem #***************************************** rem # STEP02 日付計算 rem #***************************************** w_date = replace(DateAdd("d",WScript.Arguments.Item(0), date),"/","") WScript.Echo w_date Script.Quit 0 【前提】 cip△dtコマンドをDOSで打つと例のように出力されます。 【例】 YYYY/MM/DD△00:00:00 cip~~~~~~~ YYYY/MM/DD△00:00:00 cip~~~~~~~ 【実現したいこと】 VBスクリプトで、その1行目の日付を取得し、DOSの変数として保持したいです。 【前提】 cip△-dYYYYMMDDをDOSで打つとYYYYMMDDが入力した通りにでます。 【例】 YYYY/MM/DD△00:00:00 cip~~~~~~~ 【実現したいこと】 VBスクリプトで、前日の日付を取得し、DOSの変数として保持したいです。 どなたか助けてください。 宜しくお願いします。

  • VBスクリプトで指定コマンドを使って日付の取得

    お世話になります。 VBスクリプトがうまく設定できなくて困っています。 下記は日付取得までです。 rem #***************************************** Option Explicit dim w_date rem #***************************************** rem # STEP01 パラメータチェック rem #***************************************** IF WScript.Arguments.Count = 0 then WScript.Echo "Parameter_No" WScript.Quit 99 End IF IF IsNumeric(WScript.Arguments.Item(0)) = False then WScript.Echo "Numeric_Check_Error" WScript.Quit 99 End IF rem #***************************************** rem # STEP02 日付計算 rem #***************************************** w_date = replace(DateAdd("d",WScript.Arguments.Item(0), date),"/","") WScript.Echo w_date Script.Quit 0 【前提】 cip△dtコマンドをDOSで打つと例のように出力されます。 【例】 YYYY/MM/DD△00:00:00 cip~~~~~~~ YYYY/MM/DD△00:00:00 cip~~~~~~~ 【実現したいこと】 VBスクリプトで、その1行目の日付を取得し、DOSの変数として保持したいです。 【前提】 cip△-dYYYYMMDDをDOSで打つとYYYYMMDDが入力した通りにでます。 【例】 YYYY/MM/DD△00:00:00 cip~~~~~~~ 【実現したいこと】 VBスクリプトで、前日の日付を取得し、DOSの変数として保持したいです。 どなたか助けてください。 宜しくお願いします。

  • 変数に昨日の日付を入力したい

    XP Excel2003を使っています day_z = Format(Now, "yyyy/mm/dd")で当日の日付を入力していますが、これを昨日の日付で入力したいのですがよろしくお願いします。

  • 入力年月日から月初の日付を求めたいのです。

    こんにちは。いつもお世話になります。 入力日付が、2003/01/10(yyyy/mm/ddの形式です)だとすると、その月の最初の日、 つまり2003/01/01を取得したいのですが、どうしたらうまくいくでしょうか? 年と月を取り出し、format関数で変数に入れようとしてみましたが、エラーになってしまいました。環境は、Access2000、winXPです。どなたかよい方法をご存知の方回答よろしくお願いします。

  • 入力された日付の正規表現の仕方を教えて下さい。

    こんばんは、いつもお世話になっております。 過去ログをあさってみたのですが、探し方が悪いのか 見つけられず…。 どうかご指導よろしくお願い申し上げます。 フォームに入力された値のチェックを、CGIに渡す前に ジャバスクリプトでもチェックしたいと思っています。 未入力や半角英数字以外のエラーチェックは出来たのですが yyyy/mm/dd形式で日付の入力をして欲しい時の チェックの書き方がわかりません。 私なりに色々と調べてみて、 if(myForm.day.value.match(/^[0-9]{4}\/[0-9]{2}\/[0-9]{2}$/)){ alert("日付は半角でyyyy/mm/dd形式でご記入下さい"); return false; } と記述してみたのですが、9999/99/99のような、ありえない 日付でも通ってしまいます。 そればらば、とおもい if(myForm.day.value.match(/^[2-3][0-9][0-9][0-9]\/[0-1][0-9]\/[0-3][0-9]$/)){ alert("日付は半角でyyyy/mm/dd形式でご記入下さい"); return false; } と書いてみたのですが、こちらはエラーが出ました(泣) どうか、ご指導よろしくお願い申し上げます。

専門家に質問してみよう