Bash中case语句里的;;为何被称为‘运算符’?
Bash中case语句的;;运算符疑问及需求实现
关于;;被称为"运算符"的原因
Bash里的"运算符"定义比常规编程语言更宽泛,除了算术、比较类运算符,控制流程的特殊符号也被归类为运算符。;;是case语句中终止当前模式分支的控制运算符,作用是告知shell"当前分支处理完成,跳出case结构"。
但它和C语言的break完全不同:;;是case语法结构的一部分,只能出现在模式分支的顶级位置(直接作为分支内的最后一条语句),不能嵌套在if、for等其他语句块中——你代码里把;;放在if内部,违反了语法规则,所以触发"syntax error"。
实现你的参数逻辑
要实现"c"同时设置c0和c1、"c-0"仅设置c0、"c-1"仅设置c1的需求,有两种清晰的写法:
方法一:拆分独立模式(推荐,可读性更高)
直接将"c"作为单独的模式分支,同时设置两个标志:
declare -A FLAGS case "$arg" in c) FLAGS["c0"]=1 FLAGS["c1"]=1 ;; c-0) FLAGS["c0"]=1 ;; c-1) FLAGS["c1"]=1 ;; *) echo "$0: unknown parameter $arg" >&2 exit 1 esac
方法二:利用fallthrough运算符;&
如果你希望通过分支穿透的方式实现,可以使用Bash的;&运算符(强制shell处理完当前分支后,继续执行下一个分支的代码):
declare -A FLAGS case "$arg" in c) FLAGS["c0"]=1 &; # 继续执行后续分支代码 c-1) FLAGS["c1"]=1 ;; c-0) FLAGS["c0"]=1 ;; *) echo "$0: unknown parameter $arg" >&2 exit 1 esac
这里的;&会让shell在处理完"c"分支后,不跳出case,直接执行"c-1"分支的代码,从而同时设置c0和c1;而"c-0"和"c-1"各自的分支用;;终止,不会互相影响。
内容的提问来源于stack exchange,提问作者U. Windl
相关产品推荐
相关产品推荐

