Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux bash if语句:表达式语法_Linux_Bash_If Statement - Fatal编程技术网

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,具有不同的语法。