私は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スクリプトについてもっと学ぼうとしています。前もって感謝します!
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/ .*$//'