私は 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/ .*$//'