&&和太多的争论shell中的运算符?

时间:2013-04-03 19:17:10

标签: shell

if [ $(ps -ef | grep date) ] && [ $(ps -ef | grep time) ]
then
     echo "success"
else
    exit 1
fi

给[:太多参数错误

出了什么问题?


来自评论:

  

有两个进程正在运行,我想检查这两个进程是否正在运行,如果执行我的自动化工具。为此,我需要检查这两个进程是否正在运行,当你说grep包含在参数中它总是成功时,你是对的我只想检查两个进程是否正在运行而忽略grep部分。我可以做一些事情,例如检查$? == 0,但我如何为这两个进程执行此操作?

2 个答案:

答案 0 :(得分:1)

[命令需要相当有限的值列表。 ps -ef命令的输出可能会生成大量数据,这些数据看起来不像[ value1 = value2 ][所期望的数据。

你可以尝试:

if [ "$(ps -ef | grep date)" ] && [ "$(ps -ef | grep time)" ]
then echo "success"
else exit 1
fi

如果至少有一个引用date的命令和至少一个引用time的命令(并且由于grep命令包含该参数,它将始终成功),这将报告成功,但这可能不是你想要的。使用单引号,由双引号强制执行,[命令检查参数是否为空字符串(如果不是则成功)。

你真的想做什么?

答案 1 :(得分:1)

最好这样做,它会比多个子shell $( )和管道|(背景中有很多fork())轻:

if pidof &>/dev/null date && pidof &>/dev/null time; then
     echo "success"
else
    exit 1
fi

不需要测试命令:

[           # POSIX test 

[[          # bash enhanced test

test        # word test 

我们在这里使用布尔逻辑