我想每隔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
答案 0 :(得分:21)
您的作业X=$X+1
不执行算术运算。如果$X
为1,则会将其设置为字符串"1+1"
。将X=$X+1
更改为let X=X+1
或let 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 ]
。