脚本从CentOs迁移到Debian – 错误消息“[:10:-lt:unexpected operator”

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

[: 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 

没有机会…

我也可以发现,使用operator ==而不是=时,用户有类似的错误信息。 那么什么才是正确的替代品? 有没有其他解决scheme? 任何暗示热烈欢迎!

Dash不支持在Bash中find的$SECONDS自动递增variables。 由于该variables没有值,因此test命令( [ )会在操作符之前看到未设置的variables,并生成您发布的错误。

示范:

 $ 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命令来执行检查。 请注意,这可能是昂贵的,因为你可以多次调用一个外部工具。

可能还有其他方法可以完成你想要做的事情,但是你不会说这是什么。

另请参阅BashFAQ / 068 。

将脚本的第一行更改为:

 #!/bin/bash 

如果你在Debian上,并且(1)像bash那样,并且(2)知道脚本是为链接/ bin / sh下的/ bin / sh的系统编写的。 我放弃尝试通用/ bin / sh脚本,如果你控制下的所有系统都支持bash,那么这是一个无用的练习。

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