Aqui estão as regras gramaticais, se isso ajudar. Eu não sou bom em lê-lo, mas com certeza parece permitido - para cada caso padrão + lista há também um caso padrão + quebra . Esse terceiro parece indicar que você pode até mesmo ficar totalmente sem padrões . O link é aqui .
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 linebreak
| '(' pattern ')' linebreak
| '(' pattern ')' compound_list linebreak
;
case_item : pattern ')' linebreak DSEMI linebreak
| pattern ')' compound_list DSEMI linebreak
| '(' pattern ')' linebreak DSEMI linebreak
| '(' pattern ')' compound_list DSEMI linebreak
De qualquer forma - faz sentido para mim que isso funcione. Os seguintes trabalhos:
x=
if $x; then $x; else echo this doesnt happen; fi
... porque os comandos não estão vazios quando analisados e o shell tem algo a fazer. Eu sempre associo um padrão a uma lista anexada diretamente. E, de fato, eles são muito bem conjugados.
x=0
for z in a b c d e f g
do case $z in [abcd]) ;; $((x+=1))) ;; esac
done; echo "$x"
3
A especificação é bem clara sobre a ordem das expansões e associações de listas de padrões. Eu sempre uno naturalmente os dois e os considero mais ou menos como um único comando. E assim, porque o shell faz algo, ele pode marcar essa caixa. Provavelmente tem algo a ver com o funcionamento de um switch switch C.