私の問題は、次のスクリプトを機能させるように単純化することができます(1つのコマンドライン引数を取ります)。
#!/bin/bash
if ["$1" == "0"]; then
echo "good"
else
echo "bad"
fi
スクリプト0を実行すると、これは正常に出力されるはずですが、取得できません。数字の周りの引用符のさまざまな組み合わせを試し、=、==、および-eqを試しました。だから...bash、それはどのように機能しますか?
私の問題は、次のスクリプトを機能させるように単純化することができます(1つのコマンドライン引数を取ります)。
#!/bin/bash
if ["$1" == "0"]; then
echo "good"
else
echo "bad"
fi
スクリプト0を実行すると、これは正常に出力されるはずですが、取得できません。数字の周りの引用符のさまざまな組み合わせを試し、=、==、および-eqを試しました。だから...bash、それはどのように機能しますか?
は[
実際にはコマンドです。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
これらは、もともとコマンドのパラメーターでした。
ブラケットと引数の間にスペースを使用する
$ cat x
#!/bin/bash
if [ "$1" == "0" ]; then
echo "good"
else
echo "bad"
fi
$ bash x 0
good
算術比較に二重括弧を使用すると、引用符やスペースを気にする必要がなくなります。次に例を示します。
#!/bin/bash
if (($1 == 0)); then
echo "good"
else
echo "bad"
fi
一般的な規則:(( ))
算術、[[ ]]
テキスト、およびパターンに使用します。
他の人が言ったように、 [ は古い Bourne シェル構文であり、それを使用する理由はほとんどありません。