我正在制作一个小脚本,以确定我是否在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的输出。
答案 0 :(得分:2)
您当前脚本的几个问题:
ONLINE
,但您要测试detect
。ifconfig | grep -cs 'status: active'
命令的结果分配给变量ONLINE
=
代替==
来测试相等性以下似乎更接近您的意图:
#!/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"