web-dev-qa-db-ja.com

「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
RickwhoPrograms

ifconfigは、完了すると8ビットの数値を返します(正常に終了する* nixプロセスと同様)。

通常、ゼロ(0)は成功を示すために使用され、別の値は失敗を示すために使用されます。この戻りコードは$?として入手できます。

ifconfigstdoutに出力されます。例:

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/ .*$//'
4
Attie