在shell脚本的行尾是否多余分号?


103

我有一个包含以下内容的shell脚本:

case $1 in
    0 )
    echo $1 = 0;
    OUTPUT=3;;
    1 )
    echo $1 = 1;
    OUTPUT=4;;
    2 )
    echo $1 = 2;
    OUTPUT=4;;
esac

HID=$2;
BUNCH=16;
LR=.008;

分号在上面的代码段中是完全多余的吗?某些人使用双分号有什么理由吗?

看来分号只是一个分隔符,您将使用它而不是换行符。

Answers:


150

行尾的单分号是多余的,因为换行符也是命令分隔符。case在每个模式块中,在最后一个命令的末尾特别需要双分号;help case有关详细信息,请参见。


20
大!因此,如果我对您的理解正确,那么我可以安全地删除任何一行末尾的任何单个分号,但永远不能删除两个分号?
内格尔

29

根据man bash

  metacharacter
         A character that, when unquoted, separates words.  One of the following:
         |  & ; ( ) < > space tab
  control operator
         A token that performs a control function.  It is one of the following symbols:
         || & && ; ;; ( ) | |& <newline>

因此,;可以是元字符或控制运算符,而;;始终是控制运算符(在命令的情况下)。

在您的特定代码中,;不需要所有行尾。该;;然是必要的。


4
;和之间的实际区别是;;什么?我对BASH语法解析还不够熟悉,无法了解BASH所谓的“元字符”和所谓的“控制运算符”之间的实际区别。
jvriesem '18

1
同意jvriesem的问题和评论,文档片段似乎有点狭窄
grgry


0

@ Opensourcebook-Amit

换行符等效;于终端或Shell脚本中的单个分号 。

请参见以下示例:

在终端上:

[root@server test]# ls;pwd;

在shell脚本上:

[root@server test]# cat test4.sh

echo "Current UserName:"
whoami

echo -e "\nCurrent Date:";date;

[root@server test]#

但我不同意&相当于换行符或单分号的评论

& 是在后台运行命令还是命令分隔符,但不能用作分号或换行符。


-2

@伊格纳西奥·巴斯克斯(Agnams)

实际上,这不是完全准确的,行尾的单个分号不是多余的,而且绝对与新行不是同一回事。

Bash参考手册

以';'分隔的命令 按顺序执行;Shell等待每个命令依次终止。返回状态是最后执行的命令的退出状态。

由“新行”分开的命令可能会在平行当分离命令由分号执行总是按顺序执行


5
这是错误的。没有区别。如果您正确地阅读了手册的同一部分,您将看到上面的几行内容:A sequence of one or more newlines may appear in a list to delimit commands, equivalent to a semicolon.因此,您引用的分号同样适用于换行符。
underscore_d

1
我同意这句话是模棱两可的,我认为作者的意思是“;”。和“ \ n”都可以不止一次地用于分隔命令,但不能同时使用同一命令。我找到了此链接:unix.stackexchange.com/questions/53390/… 在我实际上对编写的某些脚本有疑问并注意到“;”之间的区别之前,我也不知道这一点。和我的一位同事的“ \ n”。不幸的是,这是很久以前的事了,我不记得在这里发布示例是什么。
IJ

2
如果您阅读链接到@IJ的帖子,则会看到并行性来自而&不是\n。在评论中指出,他可以跳过分号,因为显然地,&它也是;和和一样的命令分隔符\n
马赛厄斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.