コマンドの$?
引数として[
(その[
コマンドがif
ステートメントの条件部分で実行されるかどうかにかかわらず)使用する唯一の理由は、次のような特定の戻りステータスを区別したい場合です。
until
cmd
[ "$?" -gt 1 ]
do
something
done
すべての人のための構文はif
、while
、until
...文は、
if cmd-list1
then cmd-list2
else cmd-list3
fi
成功したかcmd-list2
どうかに関係なく実行されます。cmd-list1
cmd-list3
[ "$?" -eq 0 ]
コマンドは何もしません。$?
が0の場合$?
は0 に設定され、$?
ゼロ以外の場合はゼロ以外に設定されます。
cmd
失敗したときに何かを実行したい場合は、次のようになります。
if ! cmd
then ...
fi
一般に、$?
どの値がtrue
またはを意味するかは言うまでもなく、いじくる必要はありませんfalse
。特定の値を区別する必要がある場合、または後で保存する必要がある場合(たとえば、関数の戻り値としてそれを返す場合)は、次のような唯一のケースです。
f() {
cmd; ret=$?
some cleanup
return "$ret"
}
また、変数を引用符で囲まないままにすることは、split + glob演算子であることも覚えておいてください。ここでその演算子を呼び出すことは意味がないため、次のようにする必要があります。
[ "$?" -ne 0 ]
ないことは言う[ $? -ne 0 ]
までもありません[$? -ne 0 ]
(たまたま最初の文字が含まれている[
場合にのみコマンドが呼び出さ$IFS
れます$?
)。
また、関数を定義するBourneの方法function-name()
は、コマンドの前にくることです。これは、シェルのようなすべてのボーン場合を除き、だbash
とyash
(との最近のバージョンposh
)のみ(化合物のコマンドはされる化合物のコマンドを許可する{...}
か、(...)
またはのようなものfor...done
、if...fi
...
function foo { ... }
あるksh
関数定義の構文は次のとおり。ここで使用する理由はありません。
コードは移植可能(POSIXly)に記述できます。
foo() (
cd -P -- "$FOOBAR" || return # what if the cd failed!
if
<some command>
then
echo 'OK!'
else
echo 'Nope!'
fi
)
また、注意してcd
なくて-P
、非常に特別な意味(含まれているハンドルパス持つ..
他のコマンドとは異なるコンポーネントを)、それは避けて混乱にスクリプトに含める方が良いですので。
(この関数はfalse
、cd
失敗した場合は戻りますが、失敗した場合は戻りませ<some command>
ん)。
$?
ISは、0に等しいif
声明、無意味であるif
コマンドを期待している場合、コマンドのリターンを述べ0
、それがブロック内のコードを実行します。そのif true; then echo hello; fi
コマンドはエコーされますので、ハローtrue
返さ0
。