我正在尝试验证程序以 $input 的形式传递的两个时间值。一旦验证,时间值将用于 SQL 插入语句。如果值超出范围,我将无法使用 date 命令,因为我收到一条错误消息。
必须将时间值传递给数据库,例如 xx:xx,因此 08:20 不能作为 8:20 传递,并且必须在 00:00 到 23:59 的有效范围内。我拆分了 $input 并通过 awk 导出了两个时间值 $startt 和 $finisht。$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
一些评论:
要删除一些错误消息,您应该使用
2>/dev/null
.您需要更频繁地测试变量的值。
当你做一些复杂的测试时
or
,and
你需要使用括号来确定你想要什么。