Linux bash if语句:表达式语法
如果:表达式语法,则出现此错误。 在这个脚本上Linux bash if语句:表达式语法,linux,bash,if-statement,Linux,Bash,If Statement,如果:表达式语法,则出现此错误。 在这个脚本上 #!/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 &
#!/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 &
/tmp/script.sh上的ls-l
:
-rwxr--r-- 1 oracle dba 705 Dec 12 07:10 /tmp/script.sh
我不能理解这个问题
编辑:
我还尝试将if语句更改为:
if [ 1 -gt 1 ]
我仍然收到了错误。我认为这不是Bash错误消息。因此,cron显然调用了另一个shell(可能是csh?)。要解决此问题,并确保使用适当的解释器运行,请更改此选项:
#!/bin/sh
为此:
#!/bin/bash
在cron内部执行的脚本没有路径,也没有源系统范围或用户配置文件。脚本找不到命令ps、grep和wc,因此$pmon_num为空
在脚本中设置路径或完全限定命令的路径名
#!/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
另一方面,为什么要将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的内容。替换:
if [ $pmon_num -gt 1 ]
then
fi
与:
因为它在您当前的环境中工作,所以请尝试修复SHELL、路径变量和解释器,看看是否仍然出现错误。e、 g.跑步
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和路径。然后用crontab-e
再次编辑任何一个crontab,并用上面的输入替换它,看看它是否工作。只要记住sh!=bash
!如果你想要巴什,那就告诉它<代码>#/usr/bin/env bash
最好换个口译员。你可以用老的“sh”。可能没有帮助,我相信系统默认值是tcsh
但是#/bin/tcsh
也没有帮助。@nir:定义“没有帮助”。它是否至少给出了更好/不同的错误消息?@nir它不会有帮助,因为脚本需要包含有效的csh
语法;问题是您正在使用sh
(或bash
)语法,并使用csh
或tcsh
执行该脚本。将crontab更改为“/bin/sh/tmp/script.sh”也是一个有趣的测试。sh是指向csh还是tcsh的链接?或者在crontab的某个地方,它改变了shell。您应该更喜欢#/usr/bin/env bash
以获取兼容性。您确定cron作业找不到wc
?根据我的经验,cron-jobs通常看起来都是从一条基本的路径开始的,我认为这条路径可以找到wc
。(但是+1:如果解释是正确的,那么它是有意义的。如果shell是Bash,则缺少wc
将导致更有用的错误消息,但正如我在回答中所指出的,此脚本显然没有在Bash中运行。)请参阅问题回复中的“我的编辑”,勾号仅将标准输出分配给pmon_num。任何错误都会发送到标准输出,在这种情况下,标准输出通常不会使用2>&1重定向到标准输出。错误被抛出或邮寄给cronjob的所有者。标准输出为空。如果[$pmon_num-gt 1]]对您有效,则表示您的问题是错误的,或者您的环境非常不寻常,则可能需要使用。在sh
中,这将创建一个子shell,并尝试将变量的内容作为语句运行,标准输出重定向到名为1
的文件。我认为这不太可能帮助未来的访问者。我怀疑您使用的是tcsh
,而不是sh
。这些是完全不同的shell,具有不同的语法。