小注意:方括号实际上是一个 Unix 命令。看看你的系统上/bin/[
是否有一个文件被调用。/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 类型的 shell 中,if
命令仅运行命令,如果命令返回退出代码0
,则执行if
子句中的命令。如果该命令没有返回退出代码0
,它会跳过子句中if
的命令并执行子句中的命令(else
如果存在)。
因此,这也是有效的:
if sleep 2
then
echo "That was a good nap!"
fi
您的计算机执行该sleep 2
命令(如果存在 sleep 命令)将返回零退出代码并继续回显 这是一个很好的午睡!.
这就是if
命令真正所做的一切。它运行给定的命令并检查退出代码。
现在,回到[
...
您可能需要查看测试命令的联机帮助页。您可以看到该命令似乎有许多与 if 语句中test
相同类型的测试。[...]
事实上,在最初的 Bourne shell(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 shell 中,您必须使用test
命令而不是方括号。
所以,回到你原来的问题。-a
和-o
是测试命令的参数(参见手册test
页。例如,您的if
语句可以这样写:
if test $testnum4 -eq 0 -a $testnum100 -ne 0 || test $testnum400 -eq 0
then
echo 0
fi
但是&&
和||
不是测试命令参数,因此不能在测试命令中使用。
请注意,这[
是 BASH 中的内置命令,因此 BASH 不会/bin/[
像原来的 Bourne shell 那样执行。然而,它仍然是一个命令,很像echo
BASH 中的内置命令,尽管/bin/echo
仍然存在。