在Bash中,为什么条件构造中需要“then”?

在Bash中,为什么条件构造中需要“then”?,bash,shell,if-statement,syntax,Bash,Shell,If Statement,Syntax,if命令的条件构造如下所示: if TEST-COMMANDS; then CONSEQUENT-COMMANDS; [elif MORE-TEST-COMMANDS; then MORE-CONSEQUENTS;] [else ALTERNATE-CONSEQUENTS;] fi while TEST-COMMANDS; do CONSEQUENT-COMMANDS; done while命令的循环结构如下所示: if TEST-COMMANDS; then CONSE

if
命令的条件构造如下所示:

if TEST-COMMANDS; then
    CONSEQUENT-COMMANDS;
[elif MORE-TEST-COMMANDS; then
  MORE-CONSEQUENTS;]
[else ALTERNATE-CONSEQUENTS;]
fi
while TEST-COMMANDS; do CONSEQUENT-COMMANDS; done
while
命令的循环结构如下所示:

if TEST-COMMANDS; then
    CONSEQUENT-COMMANDS;
[elif MORE-TEST-COMMANDS; then
  MORE-CONSEQUENTS;]
[else ALTERNATE-CONSEQUENTS;]
fi
while TEST-COMMANDS; do CONSEQUENT-COMMANDS; done

我想知道为什么在
if
命令中需要
那么在
while
命令中不需要
?为什么不能使用它?

中的do
,而
语法的作用与
中的if
语法中的
相似。它们都表示语句主体的开始-将其与语句的条件部分区分开来


是shell中的复合语句。语句的
if
then
部分作为两部分执行,只有当
if
部分以退出状态
0
结束时,才会调用
then
部分。两个部分可能包含多个语句;因此,仅用分号不足以分隔这些部分。

就像@shibley在他的回答中所说的那样,
do
then
单词用于指示要执行的动作块的开始

我做了一些研究,但找不到历史原因,所以我将猜测合乎逻辑的原因。这可能太主观了,所以不要犹豫,在下面评论一下你的印象

bash语法非常“对称”:只要有
案例
,就用
esac
完成它。而且,它的设计非常人性化,因此很容易理解

也就是说,如果您处于
while
循环中,这意味着您将在条件为真时执行某些操作。然后,当它不再是真的时,你就完蛋了。 但是,在
if
条件下,您的意思是如果发生了某些事情,那么需要执行某些事情


简而言之:
do
then
是人类可读的方式来表示相同的情况,也就是说,在
处于
如果
状态时,要对
执行的命令块的开头。

因为语言的语法表示需要它吗?在
while
循环中,语法要求
do
的方式与此相同?否则,您如何判断测试命令和主体命令的起始位置?因为while循环的
do
与if测试的
then
基本相同。它表示参数列表的结束和if/while主体的开始。把它们等同于C的代码> {< /代码> iMHO——唯一相关的(非基于意见的)答案可能是:因为BASH的语法需要它。@ JM666,更古老的SH的语法,从BASH复制,更有可能。<代码>;<代码>(命令/表达式中断)足以“从条件部分中区分”。。要求
然后
的推理是可疑的。@user2864740不,不是。
如果为真;为真;为假;然后echo hi;否则echo bye;fi
是一个有效的表达式。bash如何知道条件在哪里结束?
然后
@user2864740不,不是。条件可以是多个命令:
如果var=$(mycmd);测试-n“$var”;then true;fi
。这在循环中非常有用。他们可以为
if
语句添加一个特例来禁止这种情况,这样您就可以避免
then
,但是一致性在语法中是一件好事。换句话说,分号是命令终止符,与其他任何地方一样,不是条件终止符。
n
是条件终止符。此链接可能比TLDP链接稍微有用。