ちょっとした注意: 角括弧は実際には Unix コマンドです。/bin/[システムにorというファイルがあるかどうか/usr/bin/[を確認します。実際、これを試してください:
$ ls i-il /bin[ /bin/test
571541 -r-xr-xr-x 2 root wheel 43120 Aug 17 2011 /bin/[
571541 -r-xr-xr-x 2 root wheel 43120 Aug 17 2011 /bin/test
最初の番号は i ノード番号です。あなたはそれを見て/bin/[、/bin/testお互いに強く結びついています。それらは同じプログラムです。
この重要性については、後で説明します...
BASH およびその他の Bourne タイプのシェルでは、ifコマンドは単にコマンドを実行し、コマンドが終了コード を返す場合は、句0内のコマンドを実行します。ifコマンドが の終了コードを返さない場合、句0内のコマンドをスキップし、if句内のコマンドが存在する場合はそれを実行しますelse。
したがって、これも有効です。
if sleep 2
then
echo "That was a good nap!"
fi
お使いのコンピューターは、sleep 2(sleep コマンドが存在する場合) ゼロの終了コードを返し、エコーを続けるコマンドを実行します。.
ifコマンドが実際に行うことはそれだけです。指定されたコマンドを実行し、終了コードを調べます。
さて、に戻り[ます...
testコマンドのマンページを参照してください。このコマンドには、if ステートメントtestと同じタイプのテストが多数含まれているように見えることがわかります。[...]実際、元の Bourne シェル (BASH の派生元) では、これらは同じコマンド構造です。
if test -f $my_file
then
echo "File $my_file exists"
else
echo "There is no file $my_file"
fi
if [ -f $my_file ]
then
echo "File $my_file exists"
else
echo "There is no file $my_file"
fi
実際、元の Bourne シェルでtestは、角括弧ではなくコマンドを使用する必要がありました。
では、元の質問に戻ります。-aおよび-oは、テスト コマンドのパラメーターです (マンページを参照してください。testたとえば、ifステートメントは次のように記述できます。
if test $testnum4 -eq 0 -a $testnum100 -ne 0 || test $testnum400 -eq 0
then
echo 0
fi
ただし、&&と||はテスト コマンドのパラメーターではないため、テスト コマンド内では使用できません。
これは BASH の組み込みコマンドであるため、BASH は元の Bourne シェルのように[実行されないことに注意してください。ただし、これはまだ存在しますが、BASH の組み込み/bin/[コマンドによく似たコマンドです。echo/bin/echo