0

知道我在这个条件正则表达式中做错了什么吗?

MIN="30"

if ! [[ "$MIN" =~ [0-5]?[0-9]|\* ]]; then
  echo "INVALID MINUTE"
else
  echo "VALID MINUTE"
fi

谢谢

* 更新 *

您没有包括通配符匹配。我需要使用纯正则表达式来执行此操作,因为我还需要满足其他条件,例如小时、月份(更复杂)和星期几,如下所示:

[1-2]?[0-9]|\* - This is for hour
[1-3]?[0-9]|\* - This is for day of month
1?[0-9]|\*     - This is for month of year 
[0-7]|\*       - This is for day of week (0 = sunday etc)

即分钟必须是第一个和第二个占位符的数字,或者可以是一个通配符来匹配每个可能的分钟 0 - 59

事实上,现在我看了一下,这个解决方案不适用于一个月中的某一天,因为有人可以输入 39 这不是一个月中的有效日期。

* 更新 *

好吧,我一开始并没有完全遵循您的逻辑,但我认为您正在做一些事情。这实际上可能有效并且会更简单。我喜欢把事情复杂化...

if ! [[ "$MIN" -gt 0 && "$MIN" -lt 59 || "$MIN" == "\*" ]]; then

我现在只是在字面上评估(很好地比较)通配符时遇到了麻烦。

这里有任何想法。同时谷歌搜索。

* 更新 *

if [ "$MIN" -gt 0 ] && [ "$MIN" -lt 59 ] || [ "$MIN" = "*" ]; then

刚刚再次测试并检查了我的语法。当 MIN 介于 0 和 59 之间时,它工作得很好(真),当 MIN 超过 59 时,它也工作(报告为假),但是一旦你尝试将 MIN 设置为 *,IF 语句就会崩溃并弹出:

line 340: [: *: integer expression expected
4

2 回答 2

1

我认为你在双重否定你的条件,你也考虑过只使用数字运算符吗?

min="30"

if ! [[ "$min" -gt 0 && "$min" -lt 59 ]]; then
  echo "INVALID MINUTE"
else
  echo "VALID MINUTE"
fi
于 2013-08-04T07:50:21.747 回答
0

您的问题是(如 UPD 中所述)您无法在一个条件字符串中将变量与字符串和整数进行比较。

我建议你先比较 vs 字符串(* 符号),然后再eval比较整数

MIN="*"; #try also other MIN values

k=0; # flag. 1 - if valid, 0 - if invalid

if [ "$MIN" == "*" ]; then
    k=1;
else
    eval "MIN=$MIN";
    if [ "$MIN" -gt 0 ] && [ "$MIN" -lt 59 ]; then
        k=1;
    fi;
fi;

if [ $k -eq 0 ]
    echo "INVALID MINUTE"
else
    echo "VALID MINUTE"
fi
于 2016-03-07T17:47:44.940 回答