В чем разница между ними:
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
.
² Интерпретируются ли строки как байтовые строки или как символьные строки в текущей локали, зависит от оболочки