コマンドの$?引数として[(その[コマンドがifステートメントの条件部分で実行されるかどうかにかかわらず)使用する唯一の理由は、次のような特定の戻りステータスを区別したい場合です。
until
cmd
[ "$?" -gt 1 ]
do
something
done
すべての人のための構文はif、while、until...文は、
if cmd-list1
then cmd-list2
else cmd-list3
fi
成功したかcmd-list2どうかに関係なく実行されます。cmd-list1cmd-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。