もし!(...)そして;if[ $? -eq 0] (...)

もし!(...)そして;if[ $? -eq 0] (...)

私はシェルスクリプトを書いており、次のことで私の仕事を確認することにしました。shellcheck.net。私のスクリプトでは、次の2行を使用して機能的に同じ動作を得ることができました。

findmnt /dev/sda1 >/dev/null ; if [ $? -eq 0 ]; then echo 1; else echo 0; fi

そして

if ! findmnt /dev/sda1 >/dev/null; then echo 0; else echo 1; fi

しかし、シェルチェック投げる:

SC2181:$?を間接的に使用するのではなく、「if mycmd;」を使用して終了コードを確認してください。

どちらを使うべきか分からない。私は見る:https://github.com/koalaman/shellcheck/issues/1167これにより、いくつかの可能な値が修正されたようです。私が書いているものがベストプラクティスを使って問題なく実行され、正確に報告されていることを確認したいと思います。

ベストアンサー1

$?他のユーティリティへの複数の呼び出しでその値を使用する必要がある場合にのみ、特殊変数を使用する必要があります。たとえば、診断メッセージとして出力してから関数から返すことができます。出力される内容は終了状態にprintfリセットされるため、後で直接実行(または)して元の終了状態に戻ることはできません。何かをテストするためにリセットを使用する場合にも注意してください。他の変数に割り当てて使用することもできます。$?printfreturn "$?"return[ ... ]$?$?

$?これがプロジェクトの残りの部分で使用されるスタイルである場合は、ステートメントで使用することを検討できます。ifこの場合、技術的に$IFS数字を含めることができるので、拡張子を引用することを忘れないでください。これは、引用されていない拡張子が$?完全にまたは部分的に消える可能性があることを意味します。

utility

# shellcheck disable=SC2181
if [ "$?" -eq 0 ]; then
    echo ok
else
    echo fail
fi

しかし、これは多くの入力を必要とし、コードがやや複雑になり、理解するのがやや難しくなります。上記の呼び出しは、後に続く文と直接的な方法でリンクされませんutilityif

ifステートメントはユーティリティの終了ステータスを確認して[変数がゼロかどうかをテストするため、ここにはいくつかの追加の冗長性があります。この変数は他のユーティリティの終了状態であり、if直接使用できます。

if utility; then
    echo ok
else
    echo fail
fi

utility呼び出しがステートメントの不可欠な部分であることはここで明らかですif

また、見ることができますSC2181警告理由ShellCheck Wikiから。

おすすめ記事