Ожидается целочисленное выражение

Я хочу читать мои файлы по строкам каждые 5 секунд. На этот раз я просто попробовал одну строку bash, чтобы сделать это. И команда bash:

let X=1;while [ $X -lt 20 ];do cat XXX.file |head -$X|tail -1;X=$X+1;sleep 5;done

Однако я получил ошибку, например:

-bash: [: 1+1: integer expression expected

Какая проблема? кстати, почему мы не можем сделать $X < 20? (Вместо этого мы должны сделать -lt, меньше?)

ТНХ

Ответ 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, вероятно, этого не делает. Я не проверял соответствующую документацию, но я предполагаю, что разработчики оболочек захотят сделать их совместимыми.

Ответ 2

Я бы использовал

X=`expr $X + 1`

но это только я. И вы не можете сказать $X < 20, потому что < является оператором ввода-перенаправления.

Ответ 3

Сумма X=$X+1 должна быть X=$(expr $X + 1 ).

Вы также можете использовать < для сравнения, но вы должны написать (("$X" < "20")) с двойными скобками вместо [ $X -lt 20 ].