首页 > 解决方案 > Bash 分号等于换行符不完全正确?

问题描述

我在多篇文章中读到过;类似 UNIX 的 shell 中的分号 () 等于换行符。
但是,以下内容让我感到困惑,我也没有运气用谷歌搜索它。

我猜这是do在 shell 中的一个问题,但是“bash 分号 do”并不是最适合 google 的搜索词组合。

下面是一个简单的for说法。

for i in {1..10}
do
echo "hi"
echo "bye"
done

正如许多 Stack Overflow 专家所发布的那样,每个换行符都可以用分号代替。

所以..我们有以下“相同”的声明。

for i in {1..10}; do; echo "hi"; echo "bye"; done

我们得到:

-bash: syntax error near unexpected token `;'

分号究竟是什么?这只是一个独特的问题do吗?

标签: bashshell

解决方案


查看/循环的语法fordo

for name [ [in [words …] ] ; ] do commands; done

我们可以看到do紧随其后的是commands,所以在后面使用换行符do不会替换分号,而是空格。

复合命令的描述还说

在大多数情况下,复合命令描述中的命令列表可以通过一个或多个换行符与命令的其余部分分开,并且后面可以用换行符代替分号。

但它没有说你可以插入随机分号。“每个换行符都可以用分号代替”这句话太笼统了,而且不正确。

更多手动证据:在关于命令列表的部分中,它说(强调我的):

Alist是一个或多个管道的序列,由运算符;&&&或中的一个分隔,并且可选地由、或 a||中的一个终止。;&newline

在这些列表运算符中,&&and||具有相同的优先级,其次是;and &,它们具有相同的优先级。

一个或多个换行符的序列可能出现在list分隔命令中,相当于一个分号。

因此,换行符相当于命令列表中的分号。


推荐阅读