Regex 正则表达式和grep只匹配if循环中具有有效端口的字符串

Regex 正则表达式和grep只匹配if循环中具有有效端口的字符串,regex,bash,while-loop,grep,port,Regex,Bash,While Loop,Grep,Port,我正在尝试签入一个bash脚本,如果我得到的curl响应给了我一个有效的IANA端口。如果是的话,那么我想打破这个循环,继续下去。如果它没有给我端口,那么我希望它删除该文件,并在睡眠期后重试 我的问题是grep和regex查询。我还在学习正则表达式,不确定我是否正确。有人能证实吗。(或对同一问题提出更简单的解决方案 port_forwarding_assignment=/home/user/port_forwarding_assignment.txt while [ ! -f "$port_fo

我正在尝试签入一个bash脚本,如果我得到的curl响应给了我一个有效的IANA端口。如果是的话,那么我想打破这个循环,继续下去。如果它没有给我端口,那么我希望它删除该文件,并在睡眠期后重试

我的问题是grep和regex查询。我还在学习正则表达式,不确定我是否正确。有人能证实吗。(或对同一问题提出更简单的解决方案

port_forwarding_assignment=/home/user/port_forwarding_assignment.txt
while [ ! -f "$port_forwarding_assignment" ]; do    
    sudo curl -d "post_data_stuff" https://website/port_forward_assignment -o "/home/user/port_forwarding_assignment.txt"

    if [grep -q '^Port (6553[0-5]|655[0-2]\d|65[0-4]\d\d|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3}|0)$' "$port_forwarding_assignment"]; then
        break
    fi

    rm -f /home/user/port_forwarding_assignment.txt
    sleep 30  
done

关于代码的一些评论:

  • bash中的
    [
    字符实际上是内置的
    test
    命令的简写,因此它后面应该有一个空格。因此:
    if[…
  • 但是
    if
    测试其参数的返回代码,因此您确实不想编写
    [grep
    。相反,只需编写:
    if grep-q…
    来测试
    grep
    的返回代码
  • 要在grep中使用重复,您需要使用
    -E
    或编写
    \{…\}
    (或使用
    egrep
    作为
    grep-E
    的缩写)
  • 您可以使用管道而不是将输出存储在文件中。但是,您需要处理
    curl
    返回错误的情况,可能是
    PIPESTATUS
  • 不确定您为什么需要
    sudo
根据前3条评论进行重写:

port_forwarding_assignment=/home/user/port_forwarding_assignment.txt
while [ ! -f "$port_forwarding_assignment" ]; do    
    sudo curl -d "post_data_stuff" https://website/port_forward_assignment -o "/home/user/port_forwarding_assignment.txt"

    if grep -qE '^Port (6553[0-5]|655[0-2]\d|65[0-4]\d\d|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3}|0)$' "$port_forwarding_assignment"; then
        break
    fi

    rm -f /home/user/port_forwarding_assignment.txt
    sleep 30  
done
由于您没有检查
curl
中的返回代码,因此您也可以根据我的第4条注释进行更改。应用所有五条注释后的代码:

port_forwarding_assignment=/home/user/port_forwarding_assignment.txt
while ! curl -d "post_data_stuff" https://website/port_forward_assignment |
  tee "$port_forwarding_assignment" |
  grep -qE '^Port (6553[0-5]|655[0-2]\d|65[0-4]\d\d|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3}|0)$'
do
    sleep 30  
done

似乎您正在尝试检查端口号是否在某个范围内或类似的范围内。这不是regex的设计目的。相反,您可以从字符串中提取数字部分,转换为int,然后检查该int是否在某个范围内。希望帮助允许您添加post响应?例如,这里我看到一个r用“港口”代替“港口”;