我知道如何使用if
shell命令。但它实际上是如何工作的呢?我在网上找到的关于它的一切都只是解释了它是如何使用的。
它是shell的一个内置功能,还是只是一个我自己也可以编写的常规命令?
if echo "test"; then mkdir one; else mkdir two; fi
这会调用以echo "test"
为参数的if
命令吗?它是否"记住"了结果,以便下次执行then
或else
命令时,他们可以决定是否实际运行?
或者shell解析类似的东西并直接执行echo "test"
?如果是,为什么我们需要终止;
或n
?它不能直接扫描到then
关键字吗?
这是否调用以
echo "test"
为参数的if
命令?它是否"记住"了结果,以便下次执行then
或else
命令时,他们可以决定是否实际运行?
if
、then
和else
是shell关键字,并且使用特殊大小写。
或者shell解析这样的东西并直接执行echo"test"?如果是,为什么我们需要终止;或者\n?它不能直接扫描到then关键字吗?
它需要命令终止符,以便知道命令的参数已终止。否则,then
将作为参数传递给命令。
看起来它只使用then
部分之前的最后一个表达式的结果:
if true; then echo y; else echo n; fi # y
if false; then echo y; else echo n; fi # n
if true; false; then echo y; else echo n; fi # n
if false; true; then echo y; else echo n; fi # y
如果结果(即$?
)为零,则执行then
部分,否则执行else
部分。test ...
、[ ... ]
、[[ ... ]]
、(( ... ))
等构造函数对表达式求值并返回true或false,这就是为什么它们可以在if
语句中使用的原因。
Bash的man
页面表示if语句的语法为if list; then list; [ elif list; then list; ] ... [ else list; ] fi
,并且"列表是由一个或多个管道组成的序列,这些管道由运算符;
、&
、&&
或||
中的一个分隔,并可选择由;
、&
或<newline>
中的一个中终止。">
由于它是一个shell内置程序,它可能不需要"记住"任何内容;原则上,您可以通过让my_if
保存执行其参数的结果来编写自己的条件构造,my_then
仅在其为true
时执行其参数,my_else
仅在其是false
时执行。然而,这很容易被滥用或错误使用,而bash的if
语句需要非常特定的语法。
但即便如此,你也无法让它像if
一样工作。上面的例子将变成:
#my_if true; false; ... # this wouldn't work since my_if ends at the first ;
my_if 'true; false;'; my_then echo y; my_else echo n; # and perhaps my_fi
最后,除非您使用一些复杂的存储状态数组或其他东西,否则您将无法(轻松)嵌套my_if
。
总之,您可能能够自己复制一些if
,但可能不是全部,至少不能以比常规if
更有意义的方式使用。