2016-08-05 31 views
0

Ich mag einen Shell-Skript schreiben, dieDaten, Zeitvalidierung mit Shell-Skript

  1. Datumsformat
  2. Zeitformat
  3. Datum
  4. Zeit

von Benutzern akzeptiert und validiert das Datum und die Uhrzeit.

Beispiel:

./test.sh mmddyyyy hhmmss 12122012 121212 

sollte das richtige Ergebnis zurück.

+1

Nun, das ist zu breit. Bitte zeigen Sie [mcve] und prüfen Sie [ask]. – fedorqui

Antwort

1

Verwendung dieses, wenn Sie 0 Ihr Datum erhalten gilt

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

Sie können, was tun Sie, indem Sie entweder if oder case Aussagen zusammen mit expr Betreiber versuchen, die Eingabe in das Skript zu analysieren und zu validieren. Der Schlüssel besteht darin, die Komponenten date und time des Eingangs zu analysieren und in ein Format zu bringen, das von date --date="" interpretiert werden kann. Es gibt eine Reihe von Ansätzen, die Sie ergreifen können. Unten ist ein minimales Beispiel Ihres Beispiel Eingabe verwendet:

#!/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 

Beispiel Verwendung/Output

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

Sie können bei diesem Ansatz bauen Formate, um zusätzliches Datum/Zeit-Eingabe. Die POSIX-Shell hat nicht die größte Auswahl an Routinen für die Verarbeitung von Strings, aber sie hat mehr als genug für diese Art von Arbeit.