bash if语句:表达式语法

时间:2013-12-12 07:35:47

标签: linux bash if-statement

我收到此错误if: Expression Syntax.

在此脚本上

#!/bin/sh

pmon_num=`ps -ef | grep pmon | wc -l`
echo $pmon_num
if [ $pmon_num -gt 1 ]
then

#code

fi

如果我像这样运行脚本:/tmp/script.sh - 它有效。但错误来自crontab。 Crontab行是这样的:

* * * * * /tmp/script.sh   > /tmp/log.log 2>&1 &
ls -l上的

/tmp/script.sh

-rwxr--r-- 1 oracle dba 705 Dec 12 07:10 /tmp/script.sh

不能理解这个问题。

编辑:

我还尝试将if语句更改为:

if [ 1 -gt 1 ]

我仍然有错误。

5 个答案:

答案 0 :(得分:1)

我认为这不是Bash错误消息。所以,cron显然是在调用一个不同的shell(也许是csh?)。要解决此问题,并确保使用适当的解释器运行,请更改此:

#!/bin/sh

到此:

#!/bin/bash

答案 1 :(得分:1)

在cron中执行的脚本没有PATH,也没有源系统或用户配置文件。该脚本没有找到命令ps,grep和wc,因此$ pmon_num为空。

在脚本中设置PATH或完全限定命令的路径名。

另外,为什么要使用grep和pipe来wc -l?您可以使用grep -c,因为您不希望在一行中有几个pmon,它将返回计数。

编辑:

为您添加修改后的代码。

#!/bin/sh

pmon_num=`/bin/ps -ef | /bin/grep -c pmon`
echo $pmon_num
if [ $pmon_num -gt 1 ]
then

#code

fi

编辑:

以下是如何测试你的cron对PATH和不合格命令的看法。

#!/bin/sh

echo $PATH > /tmp/cronjob.out
which ps >> /tmp/cronjob.out 2>&1
which grep >> /tmp/cronjob.out 2>&1
which wc >> /tmp/cronjob.out 2>&1

在cron执行此脚本后,请检查/tmp/cronjob.out。

的内容

答案 2 :(得分:0)

由于它在您当前的环境中工作,请尝试修复SHELL,PATH变量和解释器,看看是否仍然出现错误。例如运行

printf "SHELL=$SHELL\nPATH=$PATH\n* * * * * /bin/sh /tmp/script.sh   > /tmp/log.log 2>&1 &\n"

这会给你一些像

这样的输出
SHELL=/bin/tcsh
PATH=/usr/lib:/usr/bin:etc...
* * * * * /bin/sh /tmp/script.sh   > /tmp/log.log 2>&1 &

但包含你的SHELL和PATH。然后使用crontab -e再次编辑任何一个crontab,并将其替换为上面的输入,看看它是否正常工作。

答案 3 :(得分:0)

请记住sh != bash!如果你想要bash然后告诉它! #!/usr/bin/env bash

答案 4 :(得分:-1)

替换:

if [ $pmon_num -gt 1 ]
then

fi

使用:

if ( $pmon_num > 1 ) then
endif