Сравнение строк из вывода команды - PullRequest
0 голосов
/ 08 октября 2019

У меня есть файл, содержащий следующий текст.

            channel: stable
  installed-version: 6.45.6
             status: finding out latest version...

            channel: stable
  installed-version: 6.45.6
     latest-version: 6.45.6
             status: System is already up to date

Я пытаюсь выполнить сравнение строк текста после последнего появления статуса:

System is already up to date

Мой сценарий выглядит следующим образом:

GOOD="status: System is already up to date"
STATUS=$(cat file.txt | grep  status | tail -1 | tr -d '\r' )

if [ "$STATUS" != "$GOOD" ]
then
     echo "There is a new version available"
else
     echo "You are up to date"

Я заметил, что строка, назначенная $ GOOD, имеет длину 29 символов, а $ STATUS - 30 символов, поэтому согласно предложению я передал оба параметра в XXD.

Заметил, что $ STATUS имел 0d (возврат каретки) и использовал tr -d '\r' для его удаления.

Теперь обе строки совпадают в HEX, но сравнение по-прежнему не удается.

Length of GOOD:37
Length of STATUS:37
00000000: 7374 6174 7573 3a20 5379 7374 656d 2069  status: System i
00000010: 7320 616c 7265 6164 7920 7570 2074 6f20  s already up to 
00000020: 6461 7465 0a                             date.
00000000: 7374 6174 7573 3a20 5379 7374 656d 2069  status: System i
00000010: 7320 616c 7265 6164 7920 7570 2074 6f20  s already up to 
00000020: 6461 7465 0a                             date.

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Как насчет использования pattern matching с командой [[ .. ]] вместо команды [ или test. Вот небольшой пример использования:

target="aaa"
string="   aaa___"

if [[ $string == *$target* ]]; then
    echo "match"
fi

Вам не нужно заботиться о начальных / конечных дополнительных символах при сопоставлении с образцом.
Тогда вы можете сказать что-то вроде:

good="status: System is already up to date"
status=$(grep "status" "file.txt" | tail -1)

if [[ $status == *$good* ]]; then
     echo "You are up to date"
else
     echo "There is a new version available"
fi

Обратите внимание, что вам не нужно заключать в кавычки переменные внутри [[и]].
Надеюсь, это поможет.

0 голосов
/ 08 октября 2019

У вас есть пробелы перед статусом. Вместо этого используйте xargs tr -d '\ r'.

GOOD="status: System is already up to date"

STATUS=$(grep status file.txt | tail -1 | xargs)

if [ "$STATUS" != "$GOOD" ]
then
    echo "There is a new version available"
else
    echo "You are up to date"
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...