我想在bash中grep ifconfig的输出

时间:2013-09-04 03:59:12

标签: bash shell grep ifconfig

我正在制作一个小脚本,以确定我是否在OSX上有互联网连接。我想更多的是练习。

在终端“ifconfig | grep -cs'status:active'”如果至少有一个活动连接将返回1

我的脚本就是这个

    #!/bin/bash

detect(){
ONLINE=ifconfig | grep -cs 'status: active'
}

if [[ detect = 1 ]]
then
        echo "Online"
else
        echo "Offline"
fi

但是,变量ONLINE始终返回0。 据我所知/理解,这与在脚本中使用管道有关。运行命令时使用子管道,当子管道关闭时,ONLINE只会被0卡住。

我想我看到了这个问题,但我不知道如何解决这个问题。我看到了一些解决while循环问题的脚本的问题,但是我没有需要ifconfig输入grep的输出。

4 个答案:

答案 0 :(得分:2)

您当前脚本的几个问题:

  1. 您设置了变量ONLINE,但您要测试detect
  2. 您实际上并未将ifconfig | grep -cs 'status: active'命令的结果分配给变量ONLINE
  3. 您使用=代替==来测试相等性
  4. 以下似乎更接近您的意图:

    #!/bin/bash
    ONLINE=$(ifconfig | grep -cs 'status: active')
    if [[ $ONLINE == 1 ]]
    then
      echo "online"
    else
      echo "offline"
    fi
    

答案 1 :(得分:1)

使用它:

ONLINE=$(ifconfig | grep -cs 'status: active')


没有“$”的原因bash将返回的是命令成功与否的结果,如果成功则总是为零。

答案 2 :(得分:0)

或者你可以像这样保持简单......

ifconfig | grep 'status: active' > /dev/null 2>&1
if [ $? == 0 ]
then
   echo "online"
else
   echo "offline"
fi

答案 3 :(得分:-1)

由于没有一个答案解释了您的脚本的确切问题,我正在添加一个答案。

问题在于ONLINE=ifconfig | grep -cs 'status: active'行。

错误的是该行中没有使用命令替换($(...)`...`)。正如其他答案所正确建议的那样,分配必须是$(ONLINE=ifconfig | grep -cs 'status: active')

这一行实际上做的是它将字符串"ifconfig"分配给变量ONLINE并通过grep -cs ...管道输出(在这种情况下没有输出)

需要注意的一点是,此分配仅适用于该行的持续时间,并且不会持续到下一行。举例说明:

samveen@precise:~$ I=0
samveen@precise:~$ echo $I
0
samveen@precise:~$ I=1 | echo "blank"
blank
samveen@precise:~$ echo $I
0

编辑:我完全错过了另一个非常重要的观点:Subroutines do not return values in bash, just exit status

因此从子程序调用中捕获变量需要子程序来回显它的预期返回值,并且它的调用需要一个带命令替换的赋值。

这样的事情:

detect(){
    ONLINE=$(ifconfig | grep -cs 'status: active')
    echo $ONLINE
}

if [[ $(detect) -eq 1 ]]
then
    echo "Online"
else
    echo "Offline"
fi

另外,使用-eq来测试数字相等性。

最后,做你想做的最简单的方法是

ifconfig | grep -q 'status:active' && echo "online" || echo "offline"
相关问题