case "$1","$name" in
-py | --python | --python3,*) if [[ "$name" =~ \..+$ ]]; then
那并没有捕捉到东西,实际上它应该捕捉到东西,比如……
USERNAME@HOSTNAME:~$ myscript --python surfer
有趣的事情:将多模式条件简化为......
--python,*) if [[ "$name" =~ \..+$ ]]; then
它有效!由于极其重复的前景,必须将该部分放置 3 次:第一次为-py
,然后为--python
,最后为--python3
捕获所有模式。
但另一件事是——相反:
case "$1" in
-py | --python | --python3) if [[ ! "$name" =~ \.py$ ]]; then
很好,有效!因此,这反驳了我的假设,即多模式语法可能不正确,可能需要删除空格,或者将所有 3 个模式的总和周围的任何类型的括号解释为一个组,其中第一个 OR 第二个 OR第三种模式应该被捕获。
综上所述,我确实有这样的印象:在 GNU bash 版本 4.3 中,你不能同时拥有多重模式和除了该条件之外的第二个条件,例如“$name”。可能是这样吗?或者我在尝试实现这一目标时犯了一个错误?
答案1
您的子句的对象case
需要正确匹配:
case "$1","$name" in
-py | --python | --python3,*) if [[ "$name" =~ \..+$ ]]; then
应该
case "$1","$name" in
-py,* | --python,* | --python3,*) if [[ "$name" =~ \..+$ ]]; then
但这可能可以用更少的重复来更清楚地表达为:
if [[ "$name" =~ \..+$ ]]; then
case "$1" in
-py | --python | --python3)
do_stuff
;;
esac
fi