2016-08-05 47 views
0

我想寫一個shell腳本將接受數據,時間驗證使用Shell腳本

  1. 日期格式
  2. 時間格式
  3. 日期
  4. 時間

從用戶將驗證日期和時間。

例如:

./test.sh mmddyyyy hhmmss 12122012 121212 

應該返回正確的結果。

+1

這太寬了。請顯示[mcve]並檢查[問]。 – fedorqui

回答

1

使用這個,如果你得到0您日期是否有效

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

你可以做你正在使用帶有expr運營商沿任ifcase語句來解析和驗證輸入到腳本試圖什麼。關鍵是解析並將輸入的datetime組件轉換爲可由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 shell沒有最大的字符串處理例程選擇,但對於這種類型的工作已經足夠了。