
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
or
undand
Klammern 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