4

違いはなんですか:

if IsServerStarted ; then ...

if [ IsServerStarted -eq 0 ] ; then ...

これらの2つのステートメントは同等である必要があるように私には思えますか?不思議なことに、2番目のステートメントは常に真です。

4

2 に答える 2

9

$PATH以下は、 namedでシェル関数または実行可能ファイルを実行しIsServerStarted、その終了コードが0(つまりtrue)の場合、thenブランチを実行します。そのような関数または実行可能ファイルが存在しない場合、終了コードは非0(つまりfalse)になり、then分岐はスキップされます。

if IsServerStarted ; then ...

以下は[、(別名)がに等しい整数であるtestかどうかをチェックします。これは(1桁も含まれていなくても)常にfalseです。したがって、非(つまりfalse)コードで終了し、分岐は常にスキップされます。IsServerStarted0IsServerStarted[0then

if [ IsServerStarted -eq 0 ] ; then ...
于 2010-04-23T14:21:47.420 に答える
0

実際には、2番目のものは「IsServerStarted」が有効な整数ではないことを訴えるエラーを出します。これは文字列定数と見なされるため、次のようになります。

var="IsServerStarted"
if [ IsServerStarted == "$var" ] ; then

成功する(または等しくない場合は失敗する)。

ndimは、最初に示した例の実行可能ファイルまたは関数に関して正しいです。

考慮すべきいくつかのバリエーション:

if $IsServerStarted ; then ...

その1ifつでは、は変数に含まれているコマンド(実行可能ファイルまたは関数)の戻り値に基づいて評価されますIsServerStarted。したがって、設定IsServerStarted=trueするifと成功します。これtrueは、常にtrueを返すシェルビルトインであるためです。IsServerStarted='grep popsicle freezer' and the御馳走がないかどうかに応じて、`が合格するか失敗するかを設定できます。

if [ $IsServerStarted -eq 0 ]; then ...

これは、変数がゼロに等しいかどうかをテストするだけです。有効な整数でない場合は、エラーメッセージが表示されます。

于 2010-04-23T17:04:29.060 に答える