В ksh
встроенная функция [
принимает операнды -eq
как в арифметическом контексте, точно так же, как Bash делает для [[
и -eq
. А в арифметическом контексте переменные не нуждаются в знаке $
.
$ ksh -c 'a=1 b=1; if [ a -eq b ]; then echo equal; else echo different; fi'
equal
$ ksh -c 'a=1 b=2; if [ a -eq b ]; then echo equal; else echo different; fi'
different
или даже:
$ ksh -c 'a=2 b=8; if [ a*4 -eq b ]; then echo equal; else echo different; fi'
equal
$ ksh -c 'a=2 b=9; if [ a*4 -eq b ]; then echo equal; else echo different; fi'
different
(Тем не менее, *
по-прежнему глобус, так что a*4
следует указать здесь.)
Это ksh93, ksh --version
показывает sh (AT&T Research) 93u+ 2012-08-01
, это из пакета Debian (ksh
, версия пакета93u+20120801-3.1
). Я получаю тот же результат с Debian mksh
, поэтому я полагаю, что ksh88 здесь достаточно близок.
Для сравнения, в Bash выдает ошибку:
$ bash -c 'a=1 b=1; if [ a -eq b ]; then echo equal; else echo different; fi'
bash: line 0: [: a: integer expression expected
different
(он печатает different
, так как [
возвращает ложное значение при ошибке ).
С [[
работает:
$ bash -c 'a=1 b=1; if [[ a -eq b ]]; then echo equal; else echo different; fi'
equal
Zsh здесь похож на Bash, [
ошибок на a -eq b
, [[
работает.