複数行のテキストを出力するコマンドを実行するスクリプトがあります。
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 -e
if
バッシュ文書-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