Bash 直到循环保持时间范围有效不起作用

Bash 直到循环保持时间范围有效不起作用

我在以下的until循环中遇到了问题bash。我希望只要输入的时间值超出有效范围,就会出现一个Zenity弹出框。弹出窗口打开正常。但是,无论输入的数据是否有效,它都会不断弹出(我必须退出终端才能跳出循环)。

#!/bin/bash

startt=30:20
finisht=12:45

until [[ $startt =~ [0-2][0-9]:[0-5][0-9] ]] && [[ $finisht =~ [0-2][0-9]:[0-5][0-9] ]]; 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: ")"
done

如果有人能提供帮助,我将不胜感激。

答案1

我现在知道这里出了什么问题。首先,var2 和输入数据 (startt & finisht) 之间没有联系。因此,逻辑上出现了问题。Zenity 部分实际上输入了输入数据,然后将其保存到变量 var2 中。变量 var2 本质上包含两个用逗号分隔的变量 (30:20,12:45)。为了分隔它们,我通过 awk 创建了两个变量 b1 (30:20) 和 b2 (12:45),然后将它们传递给 till 条件。现在,这表明,直到 b1 和 b2 处于指定条件内,才会继续打开 Zenity 输入框:

#!/bin/bash

until [[ $b1 =~ [0-2][0-9]:[0-5][0-9] ]] && [[ $b2 =~ [0-2][0-9]:[0-5][0-9] ]]; 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}')
done

但是这并没有回答以下问题。我真正想要的是 zenity 弹出框打开,这样我就可以重新输入数据,如果 startf 或 finishf 不在有效范围内,直到 b1 和 b2 的正确数据输入到 Zenity 框中。所以最终的代码应该是这样的:

input=30:20,12:45

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

if [[ ! $startt =~ [0-2][0-9]:[0-5][0-9] ]] || [[ ! $finisht =~ [0-2][0-9]:[0-5][0-9] ]];
then
                                until [[ $b1 =~ [0-2][0-9]:[0-5][0-9] ]] && [[ $b2 =~ [0-2][0-9]:[0-5][0-9] ]]; 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}')

                                done

fi

echo $var2

变量 var2 现在可用于进一步的验证测试,并且包含在指定范围内的数据。

相关内容