「ifconfig」などの Bash コマンドの戻り値を Bash スクリプトの if ステートメントの引数として使用する方法

「ifconfig」などの Bash コマンドの戻り値を Bash スクリプトの if ステートメントの引数として使用する方法

私は Bash スクリプトについては比較的初心者ですが、Python と多くの Bash コマンドには精通しています。次のようなコマンドを使用してifconfig eno1、その出力をステートメントで使用する条件として使用できるかどうか疑問に思っていますif。基本的に、次のように発行すると、

 ifconfig eno1

アクティブな IP を取得した場合、その出力を 1/0 または true/false として変数に保存し、次のifステートメントの例で使用する方法はありますか (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

ifconfigの出力を非表示にするには、 を追加します> /dev/null

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

戻りコードの印刷について質問がありましたが、これは初心者にとっては落とし穴です...

次のように簡単に実行できます:

ifconfig eth0
echo $?

しかし、 を呼び出した後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/ .*$//'

関連情報