
たくさんの投稿を使ってみました
if [ $? -ne 0 ]; then
return
fi
if [ $? -eq 0 ]; then
eval "set -- ${opts}"
while [ $# -gt 0 ]; do
case $1 in
「Last Exit Status」と「Number of Positional Arguments」の値を確認するために使用されます。
しかし、私は明らかな問題なしに次のように使用してい$#
ます$?
。
if (( $? != 0 )); then
...
または
if (( $? == 0 )); then
...
もしそうなら、これらの方法の1つは悪い習慣ですか、それとも構文規則を「拡張」しますが、もう1つはこれらの変数を使用する「正しい」方法ですか?それとも両方のスタイルを使用しても安全ですか?
答え1
はい、$?
(および$#
)は数値であり、算術比較構造を使用できます。ただし、(( ... ))
asテスト構成の使用はBashに固有のものであり、この方法で作成されたスクリプトは移植可能ではない可能性があります。これは算術と$(( ... ))
同じではありません。拡張これはPOSIX標準機能。
[ $? -eq ... ]
検証に(またはBash固有の[[ ... ]]
)テスト構造を使用する理由$?
は、算術的文脈では必要ないため、通常は変数参照から省略されますが$
(および)の場合は不可能です。$?
$#
の数値範囲は$?
0 ~ 255 (1)(2)です。原則として、を返すシェルスクリプトを書くことができますが、exit -2
実行$?
後の呼び出しは通常254を表示します(ただし、すべてのシェルがこれを許可するわけではありません。一部はsh: 1: exit: Illegal number: -2
その逆です)。
(1) @glenn jackmanがコメントで説明したように、終了ステータスはunsigned char
変数として実装されているため、0から255の整数のみを保持することが保証されています。
(2) また、@Paul_Pedantがコメントで指摘したように、実行可能ファイルのプログラマは終了コードとして0から255の範囲の値を選択できますが、0は通常成功した完了を示すために使用され、シェルは125より高い値を使用できます。上記の特別な方法ここたとえば、この場合、正確な値は信頼できないか、少なくとも正確に解釈するのが難しい場合があります。
答え2
はい、$?
最後のプロセスの状態は0から255までの数値です。
しかし、==
文字列比較演算子と数値を使用するのは賢明ではありません。代わりにとを!=
使用してください。読む。-eq
-ne
man bash