私は次のような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;
代わりに、出口が0
or-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 "$?"
動作します。