регулярное выражение bash match в выражении IF - PullRequest
0 голосов
/ 20 декабря 2018

Пожалуйста, помогите мне понять, что не так.Сценарий ниже все время возвращает "не совпадает"

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

Я пробовал другой формат регулярного выражения:

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 ]]'

Похоже, правая часть = ~ не интерпретируется как регулярное выражение, но я не могу понять, почему.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Как сказал 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 ]]
0 голосов
/ 20 декабря 2018

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
...