在bash脚本中,;和&以及;;之间有什么区别?

5
我正在将一个Bash脚本从Linux电脑复制到我的Mac笔记本电脑,但在此过程中,该脚本开始抱怨使用了“;&”。

错误如下:

./build.sh: 行 122: 语法错误,附近有意外的标记“;'
./build.sh: 行 122: ` ;&'

脚本中有几个用途,但其中一个简短的用法是:

case ${OPTION} in
    xxx)
        export DEVICES=xxx
         ;;
    yyy)
        export DEVICES=yyy
         ;;
    *)
        echo "${OPTION}: Unknown device type:  use xxx|yyy"
        exit 1
        ;&
    esac
;;

我已经将所有使用;&的地方替换为;;,我认为一切都没问题,但我仍然好奇我做了什么。在case语句中,分号和&和两个分号有什么区别?


3
这个方法不能在 OS X 上运行是因为它需要 bash 4 版本的支持,而 OS X 自带的是 bash 3.2 版本(因为他们不愿意提供 GPLv3 许可的代码)。 - Charles Duffy
@CharlesDuffy 感谢您的见解:看起来,OSX 上过时的软件是“设计上”的。我在这里找到了更多关于这个政策的信息:苹果公司的大型 GPL 清除行动 - John1024
1个回答

7

来自man bash

在使用; &替代;;的情况下,执行将继续与与下一个模式集相关联的列表。

由于;&出现在case语句中的最后一个模式上,因此它不应在该脚本中造成任何影响。


8
换句话说,;& 模仿了 C 语言 switch 语句的“穿透”行为。它不能在 OS X 上工作的原因是 OS X 自带的 Bash 版本过时。 - that other guy
1
@thatotherguy:我不会把3.2称为“过时的”。就在不久前,你仍然需要编写高度可移植的shell脚本,使用test而不是[,因为仍然有一些盒子使用的是最初的1977 Bourne shell /bin/sh。你不能责怪苹果拒绝发布GPL3的Bash 4,因为这将由于反Tivoization条款阻止其在iPhone上使用。 - Warren Young
1
@WarrenYoung 嗯,Bash 3.2发布已经有9年了,在软件领域这是相当长的时间。当时还没有Android和iPhone,Windows XP上的IE 6是最先进的浏览器。(另外,我想你会惊讶于我能够责怪苹果的事情 :P) - that other guy
@thatotherguy: 我的 Mac 上 bash --version 显示的是 2007 年,与 iPhone 发布的同一年。iPhone 在主题演讲之前已经开发了大约三年(详情请见 http://en.m.wikipedia.org/wiki/Iphone#History_and_availability)。 - Warren Young
@thatotherguy 如果它不起作用,那么在这种情况下如何将脚本移植到OSX? - kimi
1
@kimi 在Mac OSX上,您可以使用 homebrew 安装现代软件,包括 bash。例如,可以参考以下链接:如何在Mac OS X Yosemite上更新bash - John1024

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接