1

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

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

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

这会调用一个if带有echo "test"参数的命令吗?它是否“记住”了结果,以便下次执行thenorelse命令时,它们可以决定是否实际运行?

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

4

2 回答 2

2

这会调用一个if带有echo "test"参数的命令吗?它是否“记住”了结果,以便下次执行thenorelse命令时,它们可以决定是否实际运行?

if, then, andelse是 shell 关键字,并且是特殊情况。

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

它需要命令终止符,以便它知道命令的参数已经终止。否则,then将作为参数传递给命令。

于 2012-12-06T15:03:00.360 回答
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 ..., [ ... ],[[ ... ]]等结构(( ... ))对表达式求值并返回真或假,这就是它们可以在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最后,除非您使用一些复杂的存储状态数组或其他东西,否则您将无法(轻松)嵌套您的 s 。

总之,您可能能够复制if自己的一些,但可能不是全部,至少不是以比常规更有意义的方式使用if

于 2012-12-06T15:35:20.940 回答