[英]I'd like to grep the output of ifconfig in bash
我正在制作一個小腳本來確定我是否在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的輸出。
您當前腳本的幾個問題:
ONLINE
,但是您測試了detect
。 ifconfig | grep -cs 'status: active'
的結果 ifconfig | grep -cs 'status: active'
命令變量ONLINE
=
而不是==
來測試相等性 以下似乎更接近您的意圖:
#!/bin/bash
ONLINE=$(ifconfig | grep -cs 'status: active')
if [[ $ONLINE == 1 ]]
then
echo "online"
else
echo "offline"
fi
用這個:
ONLINE=$(ifconfig | grep -cs 'status: active')
沒有“$”的原因bash將返回的是命令成功與否的結果,如果成功,它總是為零。
或者你可以像這樣保持簡單......
ifconfig | grep 'status: active' > /dev/null 2>&1
if [ $? == 0 ]
then
echo "online"
else
echo "offline"
fi
由於沒有一個答案解釋了您的腳本的確切問題,我正在添加一個答案。
問題在於ONLINE=ifconfig | grep -cs 'status: active'
ONLINE=ifconfig | grep -cs 'status: active'
。
錯誤的是該行中沒有使用命令替換( $(...)
或`...`
)。 正如其他答案所正確建議的那樣,賦值必須是$(ONLINE=ifconfig | grep -cs 'status: active')
。
這一行實際上做的是它將字符串"ifconfig"
分配給變量ONLINE
並通過grep -cs ...
管道輸出(在這種情況下沒有輸出) 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"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.