Почему мое сравнение строк в bash двух одинаковых строк всегда ложно? - PullRequest
9 голосов
/ 29 августа 2011

Я пытаюсь написать простой маленький скрипт для запроса соединения 3g, и если соединение разорвалось, инициировать переподключение.

Моя проблема в проверке вывода команды - два, казалось бы, равныхстроки не оцениваются как равные.Я уверен, что где-то здесь ошибка noob!

#!/bin/bash

echo "Checking connection"
a="Not connected."
b=$(./sakis3g status --console)

if [[ "$a"!="$b" ]]; then 
    echo "Strings not equal:"
    echo "$a"
    echo "$b"
else 
    echo "Strings equal!!"
fi

Вывод при запуске:

user@mypc:~$ ./test_3g.sh 
Checking connection
Strings not equal:
Not connected.
Not connected.

При запуске ./test_3g.sh | cat -A:

user@mypc:~$ ./test_3g.sh | cat -A
Checking connection$
Strings not equal:$
Not connected.$
Not connected.$

Ответы [ 3 ]

26 голосов
/ 29 августа 2011

Вы должны поставить пробелы вокруг операторов:

if [[ "$a" != "$b" ]]; then ...

Без пробелов вы получите одну строку, эквивалентную "$a!=$b". А проверка только строки возвращает true, если эта строка не пуста ...

5 голосов
/ 29 августа 2011

Используйте case/esac. Если вам не нужно возиться с мелкими нюансами if/else

case "$a" in
"$b" ) echo "ok";;
*) echo "not ok";;
esac
0 голосов
/ 29 августа 2011

Вероятно, программа sakis3g печатает сообщение в stderr вместо stdout. В этом случае вы сравниваете ваше сообщение с пустой строкой. Попробуйте перенаправить stderr на стандартный вывод:

b=$(./sakis3g status --console 2>&1)
...