脚本从 CentOs 迁移到 Debian - 错误消息“[:10:-lt: 意外运算符”

脚本从 CentOs 迁移到 Debian - 错误消息“[:10:-lt: 意外运算符”

当我尝试在新环境中执行脚本时,出现了这个错误:

[: 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 不支持$SECONDSBash 中的自动递增变量。由于变量没有值,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,那么这是无用的。

我知道这是一个老问题,但是没有人给出最简单的答案。

相关内容