$#と$を構文的に正確で良い習慣として使用していますか?算術テスト条件では?

$#と$を構文的に正確で良い習慣として使用していますか?算術テスト条件では?

たくさんの投稿を使ってみました

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より高い値を使用できます。上記の特別な方法ここたとえば、この場合、正確な値は信頼できないか、少なくとも正確に解釈するのが難しい場合があります。

おすすめ記事