“if”shell命令如何工作?

时间:2012-12-06 14:58:34

标签: bash shell if-statement background terminal

我知道如何使用if shell命令。但它是如何实际工作的?我在网上找到的所有内容都只解释了它是如何使用的。

它是shell的内置功能还是只是我自己也可以编写的常规命令?

if echo "test"; then mkdir one; else mkdir two; fi

这是否以if为参数调用echo "test"命令?它是否“记住”结果,以便下次执行thenelse命令时,他们可以决定是否实际运行?

或者shell解析这样的东西并直接执行echo "test"?如果是这样,为什么我们需要终止;\n?它不能只扫描到then关键字吗?

2 个答案:

答案 0 :(得分:2)

  

这是否以if为参数调用echo "test"命令?它是否“记住”结果,以便下次执行thenelse命令时,他们可以决定是否实际运行?

ifthenelse是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>