【问题标题】:what is the difference between hitting `enter` after `then` and `;` in if condition在 if 条件下在 `then` 和 `;` 之后点击 `enter` 有什么区别
【发布时间】:2018-03-24 11:48:47
【问题描述】:

如果我在它运行的脚本中写这个

if [[ 1 == 1 ]]
 then
   echo "true"
 fi

但是如果我尝试用 ; 替换换行符使用活动 shell 时出现语法错误

if [[ 1 == 1 ]]; then; echo "true"; fi

为什么?

then; 之后点击enter 有什么区别

【问题讨论】:

  • then 后面不能有分号。这有点像if (newline) [[ 1 == 1 ]] …if; [[ 1 == 1 ]] … 的含义不同。
  • 技术上你根本不需要;。您甚至可以交互地使用多行。
  • if 的语法:if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi 您可以用换行符替换任何空格和分号。相反,您不能用分号替换每个换行符。

标签: bash if-statement syntax


【解决方案1】:

bash manual 说:

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

As well as:

if 命令的语法是:

if test-commands; then
  consequent-commands;
[elif more-test-commands; then
  more-consequents;]
[else alternate-consequents;]
fi

(我相信上述描述中的格式(多行,缩进)是为了人类读者的利益,而不是正式语法的一部分。也就是说,if <i>test-commands</i>; then <i>consequent-commands</i>; [elif <i>more-test-commands</i>; then <i>more-consequents</i>;] [else <i>alternate-consequents</i>;] fi 具有相同的含义。)


最初的声明说此描述中的; 可以用换行符替换,但反之则不行。

相反,它说您可以选择在命令列表之前和之后放置换行符,它们会被简单地忽略。


以你为例:

if [[ 1 == 1 ]]
 then
   echo "true"
 fi

这里有[[ 1 == 1 ]]测试命令。语法需要;,但由于“后面可以用换行符代替分号”规则,我们没问题(后面有换行符)。

对于then <i>consequent-commands</i>; 部分,我们有

 then
   echo "true"

这很好,因为 consequent-commands(即echo "true")“可能与命令的其余部分分开 [即在这种情况下为then] 一个或多个换行符"。

同样,语法需要; next,但我们使用换行符,这是初始规则所允许的。

然后我们到达fi,我们就完成了。

【讨论】:

  • 这里有一个正式的语法(用于 Posix shell):pubs.opengroup.org/onlinepubs/9699919799/utilities/… 当您阅读该语法时,您将看到非终端 linebreakseparator;第一个是 可选 系列换行符,第二个是分号后跟 linebreak强制 系列换行符。 bash 语法将第一个写为换行符,将第二个写为分号(大部分时间)。
猜你喜欢
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多