Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Bash条件正则表达式_Regex_Bash_If Statement_Conditional - Fatal编程技术网

Regex Bash条件正则表达式

Regex Bash条件正则表达式,regex,bash,if-statement,conditional,Regex,Bash,If Statement,Conditional,知道我在这个条件正则表达式中做错了什么吗 MIN="30" if ! [[ "$MIN" =~ [0-5]?[0-9]|\* ]]; then echo "INVALID MINUTE" else echo "VALID MINUTE" fi 谢谢 *更新* if [ "$MIN" -gt 0 ] && [ "$MIN" -lt 59 ] || [ "$MIN" = "*" ]; then 您没有包含通配符匹配。我需要使用纯正则表达式来实现这一点,因为我还需要满足其

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

MIN="30"

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

*更新*

if [ "$MIN" -gt 0 ] && [ "$MIN" -lt 59 ] || [ "$MIN" = "*" ]; then
您没有包含通配符匹配。我需要使用纯正则表达式来实现这一点,因为我还需要满足其他条件,如小时、月(更复杂)和星期几,如:

[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)
ie分钟数必须是第一名和第二名持有者的数字,或者可以是通配符,以匹配每一可能的分钟数0-59

事实上,现在我看到它,这个解决方案将不适用于月日,因为有人可能输入39,这不是一个有效的月日

*更新*

if [ "$MIN" -gt 0 ] && [ "$MIN" -lt 59 ] || [ "$MIN" = "*" ]; then
一开始我并没有完全理解你的逻辑,但我想你已经明白了。这实际上可能会起作用,而且会更简单。我喜欢把事情复杂化

if ! [[ "$MIN" -gt 0 && "$MIN" -lt 59 || "$MIN" == "\*" ]]; then
我现在只是在计算(很好地比较)通配符时遇到了麻烦

有什么想法吗。同时谷歌搜索

*更新*

if [ "$MIN" -gt 0 ] && [ "$MIN" -lt 59 ] || [ "$MIN" = "*" ]; then
只是再次测试并检查我的语法。当最小值在0到59之间时,它工作得很好(真),当最小值超过59时,它也工作(报告为假),但是,当您尝试将最小值设置为*时,IF语句会异常并弹出:

line 340: [: *: integer expression expected

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

min="30"

if ! [[ "$min" -gt 0 && "$min" -lt 59 ]]; then
  echo "INVALID MINUTE"
else
  echo "VALID MINUTE"
fi
您的问题是(如UPD中所解释的),您无法在一个条件字符串中同时比较带字符串和带整数的变量

我建议您首先比较vs string(*symbol),然后比较
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

在脚本中也使用小写变量,以避免与系统变量冲突。哇哦,船已经航行了2000行代码。从第一天起,我就一直在使用变量的所有大写字母。更新评论:你不应该与通配符比较(如果你发明了一种方法),因为它总是
真的
。改为使用@Mehul Rathod answer。我不记得我是如何解决这个问题的,因为这是一段时间以前的事情,但我不打算将通配符作为运算符进行比较,而只是将其作为配置文件中表示通配符的字符进行比较。不过你可能是对的。我没有想到会有这样的解释。啊!我只是在搜索一个包含星号的字符串(如果这有助于澄清问题的话)。对不起,我不明白这一点!它太大了,无法评论,我补充了答案。