Почему мое сравнение строк bash двух одинаковых строк всегда ложно?

Я пытаюсь написать простой маленький скрипт для запроса 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 ответов


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

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

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


использовать case/esac. Если вам не придется возиться с if/else ' s nitty песчаные нюансы

case "$a" in
"$b" ) echo "ok";;
*) echo "not ok";;
esac

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

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