在for循环中使用grep

时间:2013-07-22 22:23:16

标签: bash

我正在尝试用grep编写for循环。当grep返回一个值时,我想显示消息“running”。如果没有返回任何值,则显示“可用”。

我认为我的if语句有问题,但我找不到任何东西。

任何建议都将不胜感激。

    #!/bin/sh
    #JWR1.0, REL1.10

    echo "Content-type: text/html"
    echo ""

    chk_port = 'ps -ef | grep "port $i -"'

    for (( i=1; i<=5; i++ ))
    do
            if [[ $chk_port ]]; then
                    echo "Running - $i<br>"
            else
                    echo "Available - $i<br>"
            fi
    done

    echo "<br>"

    # For debugging


    ps -ef | grep "port 1 -"

示例输出:

    Available - 1
    Available - 2
    Available - 3
    Available - 4
    Available - 5

    apache 7706 7700 0 15:07 ? 00:00:00 grep port 1 -

1 个答案:

答案 0 :(得分:1)

我想您的问题是,ps的输出中有没有 port $i,但您的脚本认为它存在。

问题是,命令grep port $i -也在ps -ef的输出中,在调试输出中很明显。您可以使用ps -ef|grep foo

进行测试

为了避免它,有一个技巧,只需做

chk_port=$(ps -ef | grep "[p]ort $i -")

例如:

kent$  ps -ef|grep nothing  
kent     10226  4752  0 00:36 pts/2    00:00:00 grep --color=auto nothing

kent$  ps -ef|grep [n]othing
zsh: no matches found: [n]othing

您还可以检查grep(grep -q)的返回码以确定是否找到了模式。如果未找到匹配项,则grep返回1,否则返回0。