Разница между «>» и «-gt»

Разница между «>» и «-gt»

В чем разница между ними:

SEC=$(mysql -hxxx -Pxxx -uxxx -pxxx -se "SELECT Seconds FROM tablename")

SEC=100

Оба возвращают один и тот же результат (100). Но когда я тестирую его с помощью:

if [ ${SEC} > 1 ]
then
    echo "SEC GT 1"
else
    echo "SEC LT 1"
fi

Первый возвращает:

"SEC GT 1"

Второй возвращает:

"SEC LT 1"

Однако, если я изменю его на:

if [ ${SEC} -gt 1 ]

тогда результат будет обратным.

Я предполагаю, что это как-то связано с типом данных, и мне, по-видимому, нужно использовать castодин или другой вариант, чтобы получить тот же результат.

Просто сейчас это мешает моему тестированию, так как мне приходится IFкаждый раз помнить о необходимости менять раздел.

решение1

Первоначально [была реализована как обычная команда, идентичная за testисключением того, что [ожидает дополнительный аргумент в конце, который должен быть ]. (Она все еще существует как обычная команда, но большинство оболочек также имеют их как встроенные.) Учитывая, что это обычная команда, подлежащая обычному синтаксическому анализу, она не могла использовать математические операторы <и >без кавычек: [ ${SEC} > 1 ]содержит оператор перенаправления, это эквивалентно [ ${SEC} ] >1, перенаправляя (пустой) вывод команды [в файл с именем 1. [Команда в основном следует обычному соглашению о создании специальных опций, начинающихся с тире: большинство ее операторов начинаются с тире. Таким образом, есть [ -r foo ]проверка, можно ли прочитать файл, [ -r foo -a -w bar ]объединение двух тестов с оператором «и», [ $x -eq $y ]проверка того, равны ли $xи и т. д.$y

Эти старые оболочки имели строковое равенство ( =оператор, один из немногих, который отклоняется от соглашения тире-буква), но не упорядочивание строк¹. Однако у них были числовые сравнения, например, [ $x -le $y ]для проверки того, меньше ли целое число $xили равно $y, и этот набор операторов включает числовое равенство, [ $x -eq $y ]где [ 010 -eq 8 ], поскольку ведущий ноль означает, что число в восьмеричном формате.

Ksh представил синтаксис [[ … ]], также доступный сейчас в bash и zsh. В отличие от [ … ], который является обычной командой, [[ … ]]распознается парсером оболочки, и поэтому специальные символы, такие как (и , <могут использоваться внутри без кавычек (и они действительно не должны заключаться в кавычки). Так как -ltи друзья уже были доступны для числовых сравнений, и =уже выполнял сравнение строк, <и друзья были сделаны операторами сравнения строк (лексикографический порядок¹). Таким образом, например, [ 9 -lt 10 ]но [[ 10 < 9 ]].

¹ С помощью утилиты доступно упорядочивание строк expr; это одно из немногих применений, exprкоторое не было включено в функции оболочек POSIX. Но будьте осторожны, что exprиспользует тот же оператор для строковых и числовых сравнений, поэтому expr 9 \< 10но expr a9 \> a10.
² Интерпретируются ли строки как байтовые строки или как символьные строки в текущей локали, зависит от оболочки

Связанный контент