11

私の問題は、次のスクリプトを機能させるように単純化することができます(1つのコマンドライン引数を取ります)。

#!/bin/bash
if ["$1" == "0"]; then
    echo "good"
else
    echo "bad"
fi

スクリプト0を実行すると、これは正常に出力されるはずですが、取得できません数字の周りの引用符のさまざまな組み合わせを試し、=、==、および-eqを試しました。だから...bash、それはどのように機能しますか?

4

3 に答える 3

19

[実際にはコマンドです。ls /bin/[または を実行しますls /usr/bin/[。実際には実行可能ファイルであることがわかります。

[...]古いボーンシェル時代のものです。コマンドはステートメントを実行し、そのifステートメントの終了コードがゼロの場合、ステートメントはtrueと見なされ、if 句が実行されます。終了コードがゼロでない場合、else 句が実行されます (存在する場合)。

これらを試してください:

$ date
Fri May 18 00:04:03 EDT 2012
echo $?   #Prints the exit code of the date command
0

$ date -Q  #Shouldn't work, I hope...
date: illegal option -- q
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... 
    [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
$ echo $?    #Exit code for the date command
1

dateこれは有効なコマンドであり、終了コード 0 (の値$?)を返しますが、有効ではなく、終了コード 1 を返すことがわかりdate -Qます。

ifそれでは、ステートメントでそれらを試してみましょう。

if date
then
   echo "I've successfully printed out the date!"
else
   echo "I made a mistake in the command"
fi

これを試してください:

if date -q
then
   echo "I've successfully printed out the date!"
else
   echo "I made a mistake in the command"
fi

元々、はコマンド[...]のエイリアスでした。test以下は同等です。

if test -f /bin/ls    #Does a file called /bin/ls exist?
then
   echo "There's a /bin/ls file"
fi

if [ -f /bin/ls ]
then
   echo "There's a /bin/ls file"
fi

[これが、 andの前後にスペースを入れることが非常に重要な理由]です。これらは実際にはコマンドだからです。BASH ではシェルに組み込まれていますが、それらはコマンドです。これが、すべてのテスト パラメーター ( -f-z、および など-eq) の前にダッシュが付けられている理由でもあります。testこれらは、もともとコマンドのパラメーターでした。

于 2012-05-18T04:20:19.390 に答える
14

ブラケットと引数の間にスペースを使用する

$ cat x
#!/bin/bash
if [ "$1" == "0" ]; then
    echo "good"
else
    echo "bad"
fi

$ bash x 0
good
于 2012-05-18T03:55:21.550 に答える
12

算術比較に二重括弧を使用すると、引用符やスペースを気にする必要がなくなります。次に例を示します。

#!/bin/bash 
if (($1 == 0)); then 
    echo "good" 
else 
    echo "bad" 
fi 

一般的な規則:(( ))算術、[[ ]]テキスト、およびパターンに使用します。
他の人が言ったように、 [ は古い Bourne シェル構文であり、それを使用する理由はほとんどありません。

于 2012-05-18T05:44:16.123 に答える