POSIX标准中case构造的格式定义是否存在错误?
POSIX case语句格式的文档矛盾问题
POSIX规定:
case构造的格式如下:
case word in [(] pattern1 ) compound-list ;; [[(] pattern[ | pattern] ... ) compound-list ;;] ... [[(] pattern[ | pattern] ... ) compound-list] esac
从这个格式描述来看,第一个分支似乎不允许使用模式交替(即多个模式用|分隔)。但实际主流shell实现都支持第一个分支使用模式交替,比如以下测试:
$ for cmd in bash dash 'busybox sh' ksh; do > $cmd -c 'case a in a|b|c) echo ok ;; *) echo no ; esac' > done ok ok ok ok $
同时,该文档下方的语法规则定义也和上述格式描述不符:
case_clause : Case WORD linebreak in linebreak case_list Esac | Case WORD linebreak in linebreak case_list_ns Esac | Case WORD linebreak in linebreak Esac ; case_list_ns : case_list case_item_ns | case_item_ns ; case_list : case_list case_item | case_item ; case_item_ns : pattern ')' linebreak | pattern ')' compound_list | '(' pattern ')' linebreak | '(' pattern ')' compound_list ; case_item : pattern ')' linebreak DSEMI linebreak | pattern ')' compound_list DSEMI linebreak | '(' pattern ')' linebreak DSEMI linebreak | '(' pattern ')' compound_list DSEMI linebreak ; pattern : WORD /* Apply rule 4 */ | pattern '|' WORD /* Do not apply rule 4 */ ;
这是否属于标准文档中的错误?尤其是pattern1里的1看起来像是]的笔误,仿佛该行内容有丢失或损坏。该格式描述文本最早可追溯至2004版POSIX标准。
内容的提问来源于stack exchange,提问作者jhnc
相关产品推荐
相关产品推荐

