这个Shell脚本有什么问题?

时间:2017-03-01 14:24:29

标签: shell unix

我一直希望得到一元运营商。似乎中国没有被赋予价值。

{{1}}

2 个答案:

答案 0 :(得分:2)

不要忘记结束"fi"

PRC=`ps -ef | grep test| wc -l`
if [ "${PRC}" -eq 1 ]
then
    echo "Congrats"
fi

你没有提到什么shell,但这在bash中有效。

使用-c(count)选项保存进程grep:

PRC=`ps -ef | grep -c test`

请注意您的管道在计数中包含grep命令本身,正如您在上面的评论中提到的,您的计数很可能会产生误导,因为它只是在计算自己。相反,使用这个:

 PRC=`ps -ef | grep -c [t]est`

这将匹配带有“test”的命令,但不匹配grep命令本身。这是因为这是使用匹配以“t”开头的单词的正则表达式。您的命令以方括号开头,因此它自身不匹配。拒绝执行“grep test | grep -v grep”,这是一个草率的,只是不必要地使用一个过程。

答案 1 :(得分:2)

请注意,ps -ef | grep test通常会在输出中包含grep进程,您可能不想要。一个聪明的伎俩"为了避免这种情况,要匹配字符串" test"使用正则表达式,它不是简单的字符串" test"

$ ps -ef | grep test
jackman  27787 24572  0 09:53 pts/2    00:00:00 grep --color=auto test
$ ps -ef | grep test | wc -l
1

$ ps -ef | grep '[t]est'
(no output)
$ ps -ef | grep '[t]est' | wc -l
0

我经常这样做,我写了这个bash函数psg(对于" ps grep"):

psg () { 
    local -a patterns=()
    (( $# == 0 )) && set -- $USER     # no arguments? vanity search
    for arg do
        patterns+=("-e" "[${arg:0:1}]${arg:1}")
    done
    ps -ef | grep "${patterns[@]}"
}

您也可以使用

pgrep -f test