如何使用 Bash 指令的回傳值(例如「ifconfig」)作為 Bash 腳本中 if 語句的參數

如何使用 Bash 指令的回傳值(例如「ifconfig」)作為 Bash 腳本中 if 語句的參數

我對 Bash 腳本編寫相對較新,但對 Python 和許多 Bash 命令非常熟悉。我想知道是否可以使用諸如 之類的命令ifconfig eno1,並將輸出用作if語句中使用的條件。基本上,如果您發出:

 ifconfig eno1

if並且您獲得了活動 IP,是否有任何方法可以將其輸出保存為變數作為 1/0 或 true/false,以在以下語句範例中使用(假設ifoutput是變數名稱):

 if [ "$ifoutput" == "$True"]

 then 
         echo connection is active! 
 fi

我想到可能會呼叫基本上做同樣事情的 Python 腳本,但是我認為我會遇到同樣的問題;無法從 Python 腳本中取得要在if語句中使用的單獨傳回值。請給我建議,請對我寬容一點——正如我所說,我對 Bash 腳本來說還比較陌生!我已經有了嚴格使用 Python 執行此操作的方法,但是我正在嘗試了解有關 Bash 腳本的更多資訊。先致謝!

答案1

ifconfig完成時將傳回一個 8 位數值(就像任何乾淨退出的 *nix 進程一樣)。

通常使用零 ( 0) 表示成功,使用另一個值表示失敗。此回傳代碼可作為$?.

ifconfig也會輸出到stdout,例如:

eth0      Link encap:Ethernet  HWaddr 02:42:ac:14:00:02
          inet addr:172.20.0.2  Bcast:172.20.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:20430143 errors:0 dropped:0 overruns:0 frame:0
          TX packets:20966475 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:46532669457 (46.5 GB)  TX bytes:44114090048 (44.1 GB)

如果您嘗試確定是否ifconfig eth0成功(即:權限取決於介面是否存在),那麼您可以執行以下操作之一:

ifconfig eth0
if [ $? -eq 0 ]; then
  echo yay
fi
if ifconfig eth0; then
  echo yay
fi
ifconfig eth0 && echo yay

Hidingifconfig的輸出可以透過附加一個來實現> /dev/null

if ifconfig eth0 > /dev/null; then
  echo yay
fi

您詢問有關列印回傳程式碼的問題,這對初學者來說是一個陷阱...

你可以簡單地這樣做:

ifconfig eth0
echo $?

但是在呼叫 on 之後echo,回傳碼 ( $?) 將是echo的回傳碼,而不是ifconfig...要處理這個問題,只需將其指派給一個臨時變數:

ifconfig eth0
RET=$?
echo ${RET}
if [ ${RET} -eq 0 ]; then
  echo yay
fi

注意:[是一個可以計算表達式的內建指令,方括號 ( [/ ]) 其實不是if語法的一部分:

$ help [
[: [ arg... ]
    Evaluate conditional expression.

    This is a synonym for the "test" builtin, but the last argument must
    be a literal `]', to match the opening `['.

如果你真的想嘗試取得介面的IP位址,那麼您可能想要使用管道,例如以下之一(有很多方法可以實現相同的結果):

ifconfig eth0 | grep -Eom1 'inet addr:([0-9]{1,3}\.){3}[0-9]{1,3}' | cut -d: -f2
ifconfig eth0 | sed -re '/inet addr:/!d;s/^[^:]+://;s/ .*$//'

相關內容