Ответ 1
Ваше назначение X=$X+1
не выполняет арифметику. Если $X
равно 1, он устанавливает его в строку "1+1"
. Измените X=$X+1
на let X=X+1
или let X++
.
Что касается использования -lt
, а не <
, это только часть синтаксиса [
(т.е. команда test
). Он использует =
и !=
для равенства строк и неравенства -eq
, -ne
, -lt
, -le
, -gt
и -ge
для чисел. Как указывает @Malvolio, использование <
было бы неудобным, так как это оператор перенаправления ввода.
(Команда test
/[
, встроенная в оболочку bash, принимает <
и >
, но не <=
или >=
, для строк. Но <
или >
должен указываться символ, чтобы избежать интерпретации как оператора перенаправления ввода-вывода.)
Или рассмотрите возможность использования эквивалентной конструкции (( expr ))
, а не команды let
. Например, let X++
может быть записано как ((X++))
. По крайней мере, bash, ksh и zsh поддерживают это, хотя sh, вероятно, этого не делает. Я не проверял соответствующую документацию, но я предполагаю, что разработчики оболочек захотят сделать их совместимыми.