• 締切済み

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

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% (4900/10358)
回答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% (4900/10358)
回答No.1

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