0

我正在制作一个小脚本来确定我在 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

4 回答 4

2

当前脚本的几个问题:

  1. 您设置了一个变量ONLINE,但您测试detect.
  2. 您实际上并未将ifconfig | grep -cs 'status: active'命令的结果分配给变量ONLINE
  3. 您使用=而不是==测试是否相等

以下似乎更接近您的意图:

#!/bin/bash
ONLINE=$(ifconfig | grep -cs 'status: active')
if [[ $ONLINE == 1 ]]
then
  echo "online"
else
  echo "offline"
fi
于 2013-09-04T04:35:30.937 回答
1

用这个:

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


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

于 2013-09-04T04:04:40.710 回答
0

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

ifconfig | grep 'status: active' > /dev/null 2>&1
if [ $? == 0 ]
then
   echo "online"
else
   echo "offline"
fi
于 2013-09-04T04:05:59.607 回答
-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"
于 2013-09-04T10:42:04.707 回答