1

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

我认为我的 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 -
4

1 回答 1

1

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

问题是,该命令grep port $i -也在ps -ef's 输出中,在您的调试输出中很清楚。你可以用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。

于 2013-07-22T22:31:51.763 回答