预期的整数表达式

时间:2011-08-18 16:18:53

标签: bash

我想每隔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? (相反,我们必须做 - 小于?)

THX

3 个答案:

答案 0 :(得分:21)

您的作业X=$X+1不执行算术运算。如果$X为1,则会将其设置为字符串"1+1"。将X=$X+1更改为let X=X+1let X++

至于使用-lt而不是<,这只是[语法的一部分(即test命令)。它使用=!=用于字符串平等和不等式-eq-ne-lt-le,{数字{1}}和-gt。正如@Malvolio指出的那样,使用-ge会很不方便,因为它是输入重定向运算符。

(bash shell中内置的< / test命令接受[<,但不接受><= ,对于字符串。但必须引用>=<字符以避免解释为I / O重定向运算符。)

或者考虑使用等效的>构造而不是(( expr ))命令。例如,let可以写为let X++。至少bash,ksh和zsh支持这一点,尽管sh可能不支持。我没有检查相应的文档,但我认为shell的开发人员希望使它们兼容。

答案 1 :(得分:1)

会使用

X=`expr $X + 1`

但那只是我。你不能说$ X&lt; 20因为&lt;是输入重定向运算符。

答案 2 :(得分:1)

总和X=$X+1应为X=$(expr $X + 1 )

您也可以使用<进行比较,但必须使用双括号而不是(("$X" < "20"))来编写[ $X -lt 20 ]