Я пытаюсь сравнить две строки в операторе if. Однако сравнение, похоже, работает неправильно, так как программа каждый раз проходит первое условие.
#!/bin/bash
switch=$(ssh 192.168.14.10 egrep somefile /tmp/tmpfile.txt)
if [ "$switch" == "tmp" ]; then
echo "expected output"
else
echo "unexpected output"
fi
Выход каждый раз переходит к «ожидаемому выходу». Я даже пытался изменить первое условие на «!=», но оно все еще приходит к первому утверждению.
Измените первую строку с:
switch=$(ssh 192.16810.10.10 egrep somefile /tmp/tmpfile.txt)
На следующее:
export switch=$(ssh 192.16810.10.10 egrep somefile /tmp/tmpfile.txt)
Я сталкивался с почти идентичной проблемой много раз раньше или когда при увеличении Переменная. Где переменная = $ переменная ++
или переменная = $ переменная + 1
добавит текстовую строку «+ 1»
или «++»
до конца каждый раз, когда он зацикливался, а не увеличивался, как должен.
Использование let variable = $ variable ++
или let variable = $ variable + 1
немедленно устраняет проблему. Использование экспорта
также работало, если все было установлено до начала цикла.
Я считаю, что bash делает что-то не так, когда сохраняет эту переменную. Таким образом, сравнение активизируется, а использование let / export делает что-то другое для его сохранения. Я искал ответ на тот же вопрос, но получал противоречивые результаты, сравнивая числа вместо строк. В любом случае не помешает попробовать использовать экспорт перед первым оператором.
Я бы начал с исключения ложных пробелов:
if [ "$(printf "%s" "$switch"| tr -d " ")" = tmp ]; then
Если все еще не удалось, добавьте обе эти строки перед тестом. Если их вывод отличается, исправьте свой тест.
echo tmp | od -c
echo "$switch" | od -c
Ваше сравнение является корректным и идиоматичным кодом Bash.
Попробуйте вставить echo "switch='$switch'"
перед if
, чтобы каждый раз видеть содержимое переменной.