ちょっとした注意: 角括弧は実際には 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