2016-08-05 5 views
0

を使用し、日付と時刻を検証します。例についてはデータは、時間の検証は、私は、ユーザーからの</p> <ol> <li>日付形式</li> <li>時間形式</li> <li>日</li> <li>時間</li> </ol> <p>を受け入れるシェルスクリプトを書きたいシェルスクリプト

./test.sh mmddyyyy hhmmss 12122012 121212 

は、正しい結果を返す必要があります。

+1

これは広すぎます。 [mcve]を表示し、[ask]にもチェックを入れてください。 – fedorqui

答えて

1

使用このあなたが得る場合は0、あなたの日付はあなたがスクリプトへの入力を解析し、検証するためにexpr事業者と一緒にifcase文のいずれかを使用してしようとしているものを行うことができ、有効な

date "+%d/%m/%Y" -d "03/10/2016" > /dev/null 2>&1 
is_valid=$? 
1

です。鍵は、入力のdateとコンポーネントを解析して、date --date=""によって解釈できる形式にすることです。あなたが取ることができるいくつかのアプローチがあります。以下はあなたの例の入力を使用して、最小限の例です:

#!/bin/sh 

[ "$#" -lt "4" ] && { 
    printf "error: insufficient input.\n" 
    printf "usage: %s datestr timestr date time\n" "${0//*\//}" 
    printf " eg: %s mmddyyyy hhmmss 01012011 122515\n" "${0//*\//}" 
    exit 1 
} 

datestr= 
timestr= 

case "$1" in 
    "mmddyyyy") 
     [ $(expr length "$3") -ne "8" ] && { 
      printf "error: invalid date for format.\n" 
      printf " '%s' != '%s'\n" "$1" "$3" 
      exit 1 
     } 
     datestr="$(expr substr "$3" 1 2)" 
     datestr="$datestr/$(expr substr "$3" 3 2)" 
     datestr="$datestr/$(expr substr "$3" 5 4)" 
     ;; 
    *) printf "error: invalid date format '%s'\n" "$1" 
     ;; 
esac 

case "$2" in 
    "hhmmss") 
     [ $(expr length "$4") -ne "6" ] && { 
      printf "error: invalid time for format.\n" 
      printf " '%s' != '%s'\n" "$2" "$4" 
      exit 1 
     } 
     timestr="$(expr substr "$4" 1 2)" 
     timestr="$timestr:$(expr substr "$4" 3 2)" 
     timestr="$timestr:$(expr substr "$4" 5 2)" 
     ;; 
    *) printf "error: invalid time format '%s'\n" "$2" 
     ;; 
esac 

printf "%s\n" "$(date -d "$datestr $timestr")" 

exit 0 

使用例/出力

$ sh datetmstr.sh mmddyyyy hhmmss 12122012 121212 
Wed Dec 12 12:12:12 CST 2012 

あなたは追加の日付/時刻の入力フォーマットを追加するには、このアプローチに基づいて構築することができます。 POSIXシェルは文字列処理ルーチンの中で最大の選択肢を持っていませんが、このタイプの作業には十分以上のものがあります。

関連する問題