簡體   English   中英

我想在bash中grep ifconfig的輸出

[英]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的輸出。

您當前腳本的幾個問題:

  1. 您將變量設置為ONLINE ,但是您測試了detect
  2. 您實際上沒有分配ifconfig | grep -cs 'status: active'的結果 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

用這個:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM