2011-09-21 137 views
72

我有一个shell脚本,它包含以下内容:在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; 

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

看起来分号只是一个分隔符,你可以用它来代替新行。

回答

105

行尾的单分号是多余的,因为换行符也是一个命令分隔符。 case特别需要在每个模式块的最后一个命令结束时使用双分号;详情请参阅help case

+9

太棒了! 因此,如果我理解正确,我可以安全地删除任何行末尾的任何单个分号,但不会加上两个分号? – Nagel

+5

这是正确的。 –

22

根据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

在find的特例中,用于终止由-exec调用的命令。请参阅@kenorb对此的回答question

1

@Ignacio巴斯克斯 - 艾布拉姆斯

其实这不完全是在一行的末尾准确,单分号多余的,是绝对不一样的东西如新线。

从由分离的Bash Reference Manual

命令以“;”顺序地执行; shell会等待每个命令依次终止 。返回状态是执行的最后一个命令的退出状态 。

命令由“新行” 可能会并行执行时由分号分隔的命令是总是 @ Opensourcebook-阿米特依次

+4

这是错误的。没有区别。如果你正确地阅读了本手册的相同部分,你会看到这一点,只是上面几行:'一个或多个换行符的序列可能出现在列表中以分隔命令,相当于一个分号。“所以你引用了什么关于分号同样适用于换行符。 –

+1

我同意这句话含糊不清,我认为作者的意思是说“;”和“\ n”都可以多次使用来分隔命令,但不是它们正在做同样的事情。 我发现此链接:http://unix.stackexchange.com/questions/53390/is-there-a-way-to-run-process-parallelly-in-the-loop-of-a-bash-script 我也没有知道这之前,我真的有一个问题,我写了一些脚本,并注意到“;”之间的区别。和“\ n”由我的一位同事。 不幸的是,这是很久以前的事了,我不记得在这里发表一个例子是什么。 –

+2

如果您要阅读链接到@IJ的文章,您会发现并行性来自'&'而不是'\ n'。在评论中声明他可以跳过分号,因为显然,'&'也是一个命令分隔符,就像';'和'\ n'。 – Matthias

0

执行

换行符相当于分离在终端或shell脚本中使用单分号(;)。

参见下面的实施例:

在termainal: [根@服务器测试]#LS; PWD;


在shell脚本:

[根@服务器测试]#猫test4.sh

回声 “当前用户名:” WHOAMI

回声-e“\ n当前日期: “;日期;

[根@服务器测试]#

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

&是在后台运行也是一个命令分隔的命令,但不能担任分号或换行符。