Bash – ожидаемое целочисленное выражение

Я делаю проверку для скрипта обновления для моей темы

У меня есть 2 текстовых файла. Первый называется «current.txt» и содержит текущую версию. В этом текстовом файле есть строка 4.1.1 .

Второй называется «latest.txt» и содержит последнюю версию. В этом текстовом файле есть строка 4.2 .

Итак, вот код

 echo "Checking update"; x=$(cat ./current.txt) y=$(cat ./latest.txt) if [ "$x" -eq "$y" ] then echo There is version $y update else echo Version $x is the latest version fi 

Что это значит, если current.txt НЕ совпадает с last.txt, тогда он скажет: «есть обновление версии 4.2». Если нет, то будет сказано: «Версия 4.1.1 – это последняя версия»,

Но когда я пытаюсь запустить его. Я получаю эту ошибку

 Checking update ./test.sh: line 4: [: 4.1.1: integer expression expected Version 4.1.1 is the latest version 

Так что я делаю неправильно с этим?

2 Solutions collect form web for “Bash – ожидаемое целочисленное выражение”

Команда test , также называемая [ , имеет отдельные операторы для сравнения строк и целых сравнений:

INTEGER1 -eq INTEGER2

INTEGER1 равен INTEGER2

против

STRING1 = STRING2

строки равны

а также

STRING1! = STRING2

строки не равны

Поскольку ваши данные не являются строго целыми числами, ваш тест должен использовать оператор сравнения строк. Последнее замечание в комментариях состояло в том, что логика «-eq» не соответствовала смыслу операторов if / else echo , поэтому новый фрагмент должен быть:

 ... if [ "$x" != "$y" ] then echo There is version $y update else echo Version $x is the latest version fi 

BTW, если у вас есть две строки версии (например, в $x и $y ), вы можете использовать printf и GNU sort для поиска нового.

 $ x=4.1.1 $ y=4.2.2 $ printf "%s\n" "$x" "$y" | sort -V -r 4.2.2 4.1.1 $ if [ $(printf "%s\n" "$x" "$y" | sort -V -r | head -1) = "$x" ] ; then if [ "$x" = "$y" ] ; then echo "$x is equal to $y" else echo "$x is newer than $y" fi else echo "$x is older than $y" fi 4.1.1 is older than 4.2.2 
  • Поймать неожиданный ввод одиночного символа в bash
  • Если условие не работает в скрипте над ssh
  • чтобы проверить, действительно ли ввод действителен для ввода программ C
  • Как проверить, есть ли «другие» разрешения в домашних каталогах
  • `test` и` [`- разные бинарные файлы, любая разница?
  • Множественный оператор, который включает специальные символы, используя при возникновении ошибок
  • Невозможно сравнить результат lsb_release с строкой в ​​Bash
  • Как узнать, существует ли каталог?
  • Что означает '-size +0' в команде 'test'
  • Interesting Posts

    Что означает этот , начинающийся с многих строк во время экрана загрузки Linux?

    Использовать псевдонимы в качестве пользовательских команд в терминаторе

    Быстрый X для гостевого LXC на localhost?

    Как изменить идентификатор UID Squid во FreeBSD?

    Почему мой сценарий оболочки задыхается от пробелов или других специальных символов?

    Установка модулей perl

    Могу ли я ограничить процесс определенным количеством циклов времени / ЦП?

    Netctl заставляет getty очищать экран и повторно отображать сообщение об ошибке

    Команда RPM застряла / FREEZE при установке RPM-файла

    Предупреждения ACPI в Debian 8 о сбоях питания ASUS EEEPC 1018P

    Управление вентилятором на Lenovo Thinkpad Edge S430 и Ubuntu 13.04

    Переустановите grub на mbr без копирования файлов модулей или конфигурации

    Установка KolibriOS на флеш-накопителе с использованием GRUB2

    Клавиши для ноутбуков не работают

    Извлечь адрес Mac из вывода

    Linux и Unix - лучшая ОС в мире.