busyboxシェルスクリプト - 不明なオペランドエラーメッセージ

busyboxシェルスクリプト - 不明なオペランドエラーメッセージ

Pythonスクリプトを実行して結果を得るには、小さなシェルスクリプトを作成する必要があります。

この方法で実行しようとすると機能します。

#!/bin/sh
/usr/bin/python /etc/scripts/backup.py
result=$?

if [ $result -gt 0 ];
    then echo 'PROBLEM';
else
    echo 'OK';
fi

しかし、これをしようとすると失敗します。

#!/bin/sh
if [ $(/usr/bin/python /etc/scripts/backup.py) -gt 0 ];
    then echo 'PROBLEM';
else
    echo 'OK';
fi

次を返します。

lab-1:/etc/scripts# ./audit_test_wrapper.sh
sh: 0: unknown operand
OK

結果が間違っています。 「OK」の代わりに「PROBLEM」を印刷する必要があります。

私は今まで何を試しましたか

if [ $(/usr/bin/python /etc/scripts/backup.py) -ne 0 ];

返品

lab-1:/etc/scripts# ./audit_test_wrapper.sh
sh: 0: unknown operand
OK

私もこれを試しました:

if [ "$(/usr/bin/python /etc/scripts/backup.py)" -gt 0 ];

次を返します。

lab-1:/etc/scripts# ./audit_test_wrapper.sh
sh: out of range
OK

誰もが正しい方向に私を指すことができますか?

ありがとうございます。

答え1

$?このコマンドは標準出力に終了ステータス()を返しません。コマンド置換($(...))は標準出力をキャプチャします。

代わりに

#!/bin/sh

if ! /usr/bin/python /etc/scripts/backup.py; then
   echo 'PROBLEM'
else
   echo 'OK'
fi

PROBLEMPythonスクリプトがゼロ以外の終了状態で終了すると、最初のブランチが選択されて印刷されます。

ifこれは「スクリプトが成功しなかった場合」と理解できます。

削除したい場合!

#!/bin/sh

if /usr/bin/python /etc/scripts/backup.py; then
   echo 'OK'
else
   echo 'PROBLEM'
fi

ifこの文は、「スクリプトが成功した場合」と解釈できます。


これ間違いあなたが得る結果は、スクリプトが何も出力しないという事実に由来します。これは、コマンド置換が空であることを意味します。引用しなかったため、シェルが実行しようとするコマンドは次のとおりです。

if [ -gt 0 ]

構文エラーです。

コマンド置換を引用した場合は、デフォルトで以下を実行しようとします。

if [ "" -gt 0 ]

そして、シェルは空の文字列を整数として比較することはできません。

答え2

Kusalanandaが示したように、あなたはただ次のものを使うべきです。

if cmd; then
    echo "command succeeded"
else
    echo "command failed: $?"
fi

より例示的な例では、このコマンドを実行して、ゼロ以外の終了コードが「false」である理由と、「if」、「while」などの論理比較のゼロ終了コードがシェルコマンド構造である理由を確認できます。本当ですか?

$ if (exit 3); then echo succeeded ; else echo failed $?;fi
failed 3
$ if (exit 0); then echo succeeded ; else echo failed $?;fi
succeeded
$ 

whileループは次のように動作します。

$ i=3;while ! (exit $i); do echo failed $i; ((i--));done
failed 3
failed 2
failed 1
$ 

接続に失敗したコマンドを再試行するか、成功するまで再試行する必要がある場合に使用できます。

(exit...) を使用してコマンドを別のプロセスとして実行します.組み込みのシェルコマンドの場合、これはスクリプトを実行するシェルインスタンスがシャットダウンするのを防ぐために必要です。代わりに、シェルは終了コードが$?値を提供する子プロセスを生成します。シェルのマニュアルページに示すように。

関連情報