コマンドエラー後にbashスクリプトが終了しないようにする

コマンドエラー後にbashスクリプトが終了しないようにする

複数行のテキストを出力するコマンドを実行するスクリプトがあります。

qmicli -d /dev/cdc-wdm0 --nas-get-serving-system

出力:

Registration state: 'registered'
    CS: 'detached'
    PS: 'detached'
    Selected network: 'unknown'
    Radio interfaces: '1'
            [0]: 'none'
    Data service capabilities: '0'
    Detailed status:
            Status: 'none'
            Capability: 'cs-ps'
            HDR Status: 'none'
            HDR Hybrid: 'yes'
            Forbidden: 'yes'

最初の行で引用符で囲まれた文字列を確認したいと思います。文字列が「登録済み」と等しい場合は、何かをしたいと思います。だから最初はこれをスクリプトに入れました。

qmicli -d /dev/cdc-wdm0 --nas-get-serving-system | grep "'registered'"
if [ $? -eq 0 ]; then
    #do stuff
fi

qmicliコマンドは時々バグが発生することを除いて動作します(外部デバイスに接続され、時にはハードウェアが応答する必要があるときに応答しないことがあります)。これが発生すると、スクリプト全体が崩壊します。そのため、trueエラーが発生しないようにqmicliコマンドをORに接続しました。

qmicli -d /dev/cdc-wdm0 --nas-get-serving-system || true | grep "'registered'"

しかし、今は$?いつも0なので、私が設定したif条件は使用できません。

コマンドがエラーを返す場合、スクリプトが終了するのを防ぎながら、コマンドの複数行出力で文字列を調べるより良い方法はありますか?

ベストアンサー1

set -eスクリプトにこれと同等のものがあると仮定するため、コマンドが失敗すると終了します。

今これは一貫しています。

some command
if [ $? -eq 0 ]; then ...

これは不要なバイパスアプローチです。

if some command; then ...

ステートメントのテスト部分のコマンドが失敗すると、ステートメントの要点が無効になるため、コマンドはif実行されません。 ~からset -eifバッシュ文書-e:

失敗したコマンドがまたはwhileキーワードの直後のコマンドリストの一部である場合、ステートメントのテストuntilの一部、またはifリストで実行されたコマンドの一部(最後または後続のコマンドを除く)、部分内のすべてのコマンド、シェルは終了しません。パイプが最後のパイプであるか、コマンドの戻り状態が 。&&||&&||!

その場合は、次のようにしてください。

if qmicli -d /dev/cdc-wdm0 --nas-get-serving-system | grep "'registered'"; then
    #do stuff
fi

qmicli失敗はトリガーされませんset -e


qmicli(また、問題を引き起こしたことが失敗だとは思わない。コマンドが失敗するようにqmicli失敗して問題が発生しました。)grep

おすすめ記事