在shell脚本的一行末尾多余的分号?

时间:2011-09-21 21:42:11

标签: bash shell syntax

我有一个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;

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

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

5 个答案:

答案 0 :(得分:129)

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

答案 1 :(得分:26)

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

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:0)

<强> @ Opensourcebook-阿米特

相当于终端或shell脚本中单个分号(;)的换行符。

见下面的例子:

关于termainal: [root @ server test] #ls; pwd;

在shell脚本上:

[root @ server test] #cat test4.sh

echo&#34;当前用户名:&#34; WHOAMI

echo -e&#34; \ n当前日期:&#34 ;;日期;

[root @ server test]#

但我不同意&amp;等同于换行符或单个分号

&安培;在后台运行命令也是一个命令分隔符,但不能用分号或换行符。

答案 4 :(得分:-1)

@Ignacio Vazquez-Abrams

实际上这并不完全准确,一行末尾的单个分号多余,绝对不是新行。

来自documentation

  

由';'分隔的命令按顺序执行; shell等待   为每个命令轮流终止。返回状态是退出   最后一个命令的执行状态。

由分号分隔的命令始终按顺序执行时,由“新行”分隔的命令可能并行执行