我知道如何使用if
shell命令。但它是如何实际工作的?我在网上找到的所有内容都只解释了它是如何使用的。
它是shell的内置功能还是只是我自己也可以编写的常规命令?
if echo "test"; then mkdir one; else mkdir two; fi
这是否以if
为参数调用echo "test"
命令?它是否“记住”结果,以便下次执行then
或else
命令时,他们可以决定是否实际运行?
或者shell解析这样的东西并直接执行echo "test"
?如果是这样,为什么我们需要终止;
或\n
?它不能只扫描到then
关键字吗?
答案 0 :(得分:2)
这是否以
if
为参数调用echo "test"
命令?它是否“记住”结果,以便下次执行then
或else
命令时,他们可以决定是否实际运行?
if
,then
和else
是shell关键字,并且是特殊的。
或者shell解析这样的东西并直接执行echo“test”吗?如果是这样,为什么我们需要终止;还是\ n?它不能只扫描到then关键字吗?
它需要命令终止符,以便它知道命令的参数已终止。否则,then
将作为参数传递给命令。
答案 1 :(得分:1)
看起来它只使用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,这就是为什么它们可以在{{1}中使用的原因声明。
Bash的if
页面说if语句的语法是man
,并且“列表是一个或多个管道的序列,由一个运算符if list; then list; [ elif list; then list; ] ... [ else list; ] fi
分隔,{{ 1}},;
或&
,并可选择以&&
,||
或;
之一终止。“
由于它是一个内置的shell,它可能不必“记住”任何东西;你原则上可以通过&
保存执行其参数的结果来编写自己的条件结构,<newline>
只执行它的参数my_if
和{{ 1}}仅当它是my_then
时。然而,这很容易被滥用或使用不当,而bash的true
语句需要非常具体的语法。
但即便如此,你也无法让它与my_else
完全一样。上面的例子将成为:
false
最后你不会(轻松地)嵌套你的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
更有意义的方式复制。{/ p>