Bash-Skript zum Validieren von zwei Zeitwerten über Zenity funktioniert nicht

Bash-Skript zum Validieren von zwei Zeitwerten über Zenity funktioniert nicht

Ich versuche, zwei Zeitwerte zu validieren, die von einem Programm in Form eines Werts namens $input übergeben werden. Nach der Validierung werden die Zeitwerte in einer SQL-Insert-Anweisung verwendet. Ich kann den Datumsbefehl nicht verwenden, wenn die Werte außerhalb des gültigen Bereichs liegen, da ich eine Fehlermeldung erhalte.

Ein Zeitwert muss an die Datenbank übergeben werden, etwa xx:xx, also kann 08:20 nicht als 8:20 übergeben werden und muss im gültigen Bereich von 00:00 bis 23:59 liegen. Ich habe $input aufgeteilt und über awk zwei Zeitwerte $startt und $finisht abgeleitet. $finisht muss größer als $startt sein.

Wenn das vorherige Kriterium nicht erfüllt ist, möchte ich Zenity-Eingabefelder mit zwei Zeitfeldern öffnen, bis das richtige Kriterium darin eingegeben wurde.

Bisher habe ich das folgende Bash-Skript, aber es funktioniert nicht. Kann mir bitte jemand helfen?

#!/bin/bash

input=30:20,12:45

startt=$(echo $input | awk -F, -v  OFS=, '{print $1}')
finisht=$(echo $input | awk -F, -v  OFS=, '{print $2}')

st=`date --date="$startt" +%s`
ft=`date --date="$finisht" +%s`

let "tDiff=$ft-$st" 

if [[ ! $startt =~ [0-1][0-9]:[0-5][0-9] ]] && [[ ! $startt =~ [0-2][0-3]:[0-5][0-9] ]] || [[ ! $finisht =~ [0-1][0-9]:[0-5][0-9] ]] && [[ ! $finisht =~ [0-2][0-3]:[0-5][0-9] ]] || [[ "$tDiff" -le 0 ]];
then
                                until [[ $b1 =~ [0-1][0-9]:[0-5][0-9] ]] || [[ ! $b1 =~ [0-2][0-3]:[0-5][0-9] ]] && [[ ! $b2 =~ [0-1][0-9]:[0-5][0-9] ]] \
                                        || [[ $b2 =~ [0-2][0-3]:[0-5][0-9] ]] && [[ "$tzDiff" -le 0 ]]; do

                                var2="$(zenity --forms --title="start_time and/or finish_time are incorrect" --text "Add a start_time and a finish_time"  --separator="," \
                                      --add-entry="WARNING! Something went wrong. Please enter a valid start_time: " \
                                      --add-entry="WARNING! Something went wrong. Please enter a valid finish_time: ")"

                                b1=$(echo $var2 | awk -F, -v  OFS=, '{print $1}')
                                b2=$(echo $var2 | awk -F, -v  OFS=, '{print $2}')

                                tz1=`date --date="$b1" +%s`
                                tz2=`date --date="$b2" +%s`
                                let "tzDiff=$tz2-$tz1"

                                done

fi

echo $var2

Antwort1

Einige Kommentare :

  • Um einige Fehlermeldungen zu entfernen, sollten Sie verwenden 2>/dev/null.

  • Sie müssen den Variablenwert häufiger testen.

  • wenn Sie einige komplexe Tests durchführen orund andKlammern verwenden müssen, um sicher zu sein, was Sie wollen.

#!/bin/bash

input=30:20,12:45

startt=$(echo $input | awk -F, -v  OFS=, '{print $1}')
finisht=$(echo $input | awk -F, -v  OFS=, '{print $2}')

#
#  when you call date you need to redirect error messages to /dev/null 
#

st=$( date --date="$startt" +%s  2>/dev/null )
ft=$( date --date="$finisht" +%s 2>/dev/null ) 

#
# i will compute the diff only if i have 2 values   
#

if [ -n "$st" -a "$ft" ] ; then
    #
    # because i had 2 numbers  , conversion to timestamp was good  
    # i will normalize value of startt / finisht
    #
    startt=$(date +%H:%M  -d "$startt"  )
    finisht=$(date +%H:%M -d "$finisht" )

    #
    # we recompute the timestamp to be sure that the normalization does not change
    #
    st=$( date --date="$startt" +%s  2>/dev/null )
    ft=$( date --date="$finisht" +%s 2>/dev/null ) 

    tzdiff=$(( ft - st ))
else
    tzdiff=0
fi    

#
#   
#   test for starttt must be enclosed with ( )
#   test for finisht must be enclosed with ( )
#

while [[  ( ( ! "$startt"   =~ ^[0-1][0-9]:[0-5][0-9]$ ) && ( ! "$startt"  =~ ^[0-2][0-3]:[0-5][0-9]$ ) ) || 
          ( ( ! "$finisht"  =~ ^[0-1][0-9]:[0-5][0-9]$ ) && ( ! "$finisht" =~ ^[0-2][0-3]:[0-5][0-9]$ ) ) || 
          ( "$tzdiff" -le 0 )  ]];
do
    var2="$(zenity --forms --title="start_time and/or finish_time are incorrect" --text "Add a start_time and a finish_time"  --separator="," \
                   --add-entry="WARNING! Something went wrong. Please enter a valid start_time: " \
                   --add-entry="WARNING! Something went wrong. Please enter a valid finish_time: ")"
    #
    # we set tzdiff to zero so we are going to loop for ever if nothing the value 
    #
    tzdiff=0
    #
    # if var2 is empty do nothing 
    #
    if [ -n "$var2" ] ; then
       b1=$(echo "$var2" | cut -d, -f1 )
       b2=$(echo "$var2" | cut -d, -f2 )
       #
       # if b1 or b2 is empty do nothing 
       #
       if [ -n "$b1" -a -n "$b2"  ] ; then
           tz1=$( date --date="$b1" +%s 2>/dev/null )
           tz2=$( date --date="$b2" +%s 2>/dev/null )
           #
           # if tz1 or tz2 is empty do nothing 
           #
           if [ -n "$tz1" -a -n "$tz2" ] ; then
              startt=$(date +%H:%M -d $b1 )
              finisht=$(date +%H:%M -d $b2 )

              tz1=$( date --date="$b1" +%s 2>/dev/null )
              tz2=$( date --date="$b2" +%s 2>/dev/null )

              tzdiff=$(( tz2 - tz1 ))
           fi
       fi
    fi
    echo $var2 $startt $finisht $tzdiff
done

echo $var2 $startt $finisht $tzdiff

verwandte Informationen