Скрипт Bash для проверки двух значений времени через zenity не работает

Скрипт Bash для проверки двух значений времени через zenity не работает

Я пытаюсь проверить два значения времени, переданных программой в форме значения с именем $input. После проверки значения времени будут использоваться в операторе SQL insert. Я не могу использовать команду date, если значения выходят за пределы диапазона, так как получаю сообщение об ошибке.

Значение времени должно быть передано в базу данных как xx:xx, поэтому 08:20 не может быть передано как 8:20 и должно быть в допустимом диапазоне от 00:00 до 23:59. Я разделил $input и вывел два значения времени $startt и $finisht с помощью awk. $finisht должен быть больше $startt.

Если предыдущие критерии не выполнены, я хочу открыть поля ввода Zenity с двумя полями времени до тех пор, пока в них не будут введены правильные критерии.

Пока у меня есть следующий скрипт Bash, но он не работает. Может кто-нибудь помочь?

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

решение1

Некоторые комментарии:

  • Чтобы удалить некоторые сообщения об ошибках, следует использовать 2>/dev/null.

  • Вам необходимо чаще проверять значение переменной.

  • когда вы проводите сложные тесты orи andвам нужно использовать скобки, чтобы быть уверенным в том, что вы хотите.

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

Связанный контент