"if"外壳命令如何工作?



我知道如何使用ifshell命令。但它实际上是如何工作的呢?我在网上找到的关于它的一切都只是解释了它是如何使用的。

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

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

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

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

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

ifthenelse是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更有意义的方式使用。

相关内容

  • 没有找到相关文章

最新更新