Если операторы в bash Linux

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

Выход каждый раз переходит к «ожидаемому выходу». Я даже пытался изменить первое условие на «!=», но оно все еще приходит к первому утверждению.

0
06.12.2016, 04:41
3 ответа

Измените первую строку с:

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 делает что-то другое для его сохранения. Я искал ответ на тот же вопрос, но получал противоречивые результаты, сравнивая числа вместо строк. В любом случае не помешает попробовать использовать экспорт перед первым оператором.

0
28.01.2020, 04:49

Я бы начал с исключения ложных пробелов:

if [ "$(printf "%s" "$switch"| tr -d " ")" = tmp ]; then

Если все еще не удалось, добавьте обе эти строки перед тестом. Если их вывод отличается, исправьте свой тест.

echo tmp | od -c
echo "$switch" | od -c
0
28.01.2020, 04:49

Ваше сравнение является корректным и идиоматичным кодом Bash.

Попробуйте вставить echo "switch='$switch'" перед if, чтобы каждый раз видеть содержимое переменной.

0
28.01.2020, 04:49

Теги

Похожие вопросы