当我尝试在新环境中执行脚本时,出现了这个错误:
[: 10: -lt: unexpected operator
以下是该脚本最令人痛苦的部分:
end=$((SECONDS+60))
while [ $SECONDS -lt $end ];
do
# process some queue...
sleep 5
done
原始系统:Amazon Linux AMI 版本 2013.09 (cpe:/o:amazon:linux:2013.09:ga)
目标系统:Debian 版本 6.0.7
我读到 shell / bash / dash 版本可能有所不同,但这对我来说仍然很模糊。我尝试在脚本的第一行指定正确的 shell:
#! /bin/bash
或者
#! /bin/sh
没有机会...
我还发现,当使用运算符 == 而不是 = 时,用户会收到类似的错误消息。那么,-lt 的正确替代品是什么?还有其他解决方案吗?热烈欢迎任何提示!
答案1
Dash 不支持$SECONDS
Bash 中的自动递增变量。由于变量没有值,test
命令 ( [
) 在运算符之前看到一个未设置的变量,并产生您发布的错误。
示范:
$ dash -c 'echo "[$SECONDS]"'
[]
$ bash -c 'echo "[$SECONDS]"'
[0]
$ dash -c '[ $var -lt 3 ]'
dash: 1: [: -lt: unexpected operator
$ dash -c 'var=1; [ $var -lt 3 ]'
$
您可以使用date
命令来执行检查。请注意,这可能很昂贵,因为您可以多次调用外部实用程序。
可能还有其他方法可以完成您要做的事情,但您没有说那是什么。
另请参阅Bash常见问题/068。
答案2
将脚本的第一行更改为:
#!/bin/bash
如果您使用的是 Debian,并且 (1) 喜欢 bash,并且 (2) 知道该脚本是为将 /bin/bash 链接到 /bin/sh 下的系统编写的。我放弃了尝试通用 /bin/sh 脚本的尝试,如果您控制的所有系统都支持 bash,那么这是无用的。
我知道这是一个老问题,但是没有人给出最简单的答案。