我在以下的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 现在可用于进一步的验证测试,并且包含在指定范围内的数据。