複数の終了コードがある場合、Bash if ステートメントで終了コードを間接的に確認できますか?

複数の終了コードがある場合、Bash if ステートメントで終了コードを間接的に確認できますか?

私は次のようなBashスクリプトを書いています。

  qSHOWROOTS; if [ $? -eq 0 ]; then
    ncxy 0 "$vpos_l"; prin…
  elif [ $? -eq 1 ]; then
    ncxy 0 "$vpos_l"; prin…
  elif [ $? -eq 3 ]; then
    ncxy 0 "$vpos_l"; prin…
  fi

qSHOWROOTSゼロ以外の終了*コードで一度だけ実行する必要がありますが、これは良いことなので、上記のように書くのがより適切であると思いましたが、shellcheckパニック全体が私に伝えます。ただしなければならないif cmd;代わりに、出口が0or-1どこにあるかを確認することに制限されます255。そうですか?無視してもいいですか?それとも別の方法を見つける必要がありますか?

ありがとうございます!

ベストアンサー1

$?最後のコマンドの終了状態に展開されます。

if [ $? -eq 0 ]; then
    ncxy 0 "$vpos_l"; prin…
  elif [ $? -eq 1 ]

2番目の[コマンドを実行すると(最初のコマンドが失敗[したと仮定して)、最初のコマンドの終了ステータス([1)を簡単に確認できます。

ここでは、次を宣言する必要がありますcase

qSHOWROOTS
case $? in
  (1) something;;
  (2) something else;;
  ...
  (*) anything else
esac

$?一度だけ拡張されます。

ステートメントを使用する必要がある場合は、終了ステータスを別の変数にif保存する必要があります。qSHOWROOTS

qSHOWROOTS; ret=$?
if [ "$ret" -eq 1 ]; then
  something
elif [ "$ret" -eq 2 ]; then
  something else
...
else
  anything else
fi

shellcheck[ $? -eq 0 ]オブジェクトを次から時々見られるものに変換します。

cmd
if [ $? -eq 0 ]

存在するスタイル地面。

これはコマンドの実行である[ため、前のコマンドがtrueを返した場合[は、成功を直接確認するのではなくtrueを返し、成功を確認しますcmd。これはやや愚かなことです。あなたは書くことができます: if cmd; then....

現在のバージョンのシェルチェックは、欠落している引用符を報告しません。$?しかし、これは誤ったコーディング慣行とバグです。コードは、$IFS数値を含まないコンテキストでのみ正しく機能するためです。

[ "$?" -eq 0 ]command() 引数のリストコンテキストにあるので、分割+globを避ける必要があります[。ではcase $?リストのコンテキストにはないので、引用符は必要ありませんが、問題ではありません。case "$?"動作します。

おすすめ記事