bash匹配IF语句中的regexp

时间:2018-12-20 18:00:40

标签: regex bash if-statement space

请帮助我了解问题所在。下方的脚本始终返回“不匹配”

while true
do
        PING_OUTPUT="64 bytes from 8.8.8.8: icmp_seq=1 ttl=119 time=35.2 ms"  #`ping -c 1 $PING_HOST |sed -n 2p`
        echo "$PING_OUTPUT"
        if [[ "$PING_OUTPUT" =~ 64\sbytes\sfrom\s8.8.8.8:\sicmp_seq=1\sttl=119\stime=35.2\sms ]]
        then
                echo "Match"
        else
                echo "Doesn't match"
        fi
        read -p "Where to ping?" PING_HOST
done

我尝试了不同格式的regexp:

if [[ "$PING_OUTPUT" =~ 64[ ]bytes[ ]from[ ]8.8.8.8:[ ]icmp_seq=1[ ]ttl=119[ ]time=35.2[ ]ms ]]

这一次显示语法错误:

./main_script.sh: line 10: syntax error in conditional expression
./main_script.sh: line 10: syntax error near `]bytes['
./main_script.sh: line 10: `    if [[ "$PING_OUTPUT" =~ 64[ ]bytes[ ]from[ ]8.8.8.8:[ ]icmp_seq=1[ ]ttl=119[ ]time=35.2[ ]ms ]]'

似乎==的右边没有被解释为regexp,但我不明白为什么。

2 个答案:

答案 0 :(得分:1)

Bash不支持\s,因为它使用POSIX正则表达式库,这就是您第一次尝试失败的原因。


在bash手册中,其内容为:

  

...模式的任何部分都可以加引号,以强制将引号部分匹配为字符串...

因此,只需引用这些空格即可。例如:

PING_OUTPUT="64 bytes from 8.8.8.8: icmp_seq=1 ttl=119 time=35.2 ms"  #`ping -c 1 $PING_HOST |sed -n 2p`
if [[ "$PING_OUTPUT" =~ 64" "bytes" "from" "8.8.8.8:" "icmp_seq=1" "ttl=119" "time=35.2" "ms ]]; then
    echo "Match"
else
    echo "Doesn't match"
fi

答案 1 :(得分:1)

正如oguzismail所说,bash不支持\ s。

如果要在bash中匹配任何形式的空格,请使用[[:space:]]。

if [[ "$PING_OUTPUT" =~ 64[[:space:]]bytes[[:space:]]from[[:space:]]8.8.8.8:[[:space:]]icmp_seq=1[[:space:]]ttl=119[[:space:]]time=35.2[[:space:]]ms ]]