我想做这样的事情,在星期五,输出是匹配的两个条件:
#!/bin/bash
#!/bin/bash
NOW=$(date +"%a")
case $NOW in
Mon)
echo "Mon";;
Tue|Wed|Thu|Fri)
echo "Tue|Wed|Thu|Fri";;
Fri|Sat|Sun)
echo "Fri|Sat|Sun";;
*) ;;
esac
正如上面的代码所写,周五的唯一输出将是:
周二|周三|周四|周五
周五期望产出:
周二|周三|周四|周五 周五
|周六|周日
我的理解是,正常情况下,仅对应于第一个模式的命令与表达式匹配的内容将被执行。
有没有办法执行其他匹配模式的命令?
编辑:我不是在寻找跌倒行为,但这也是一件值得了解的事情。谢谢钢铁司机。
答案1
您可以使用;;&
连词。从man bash
:
Using ;;& in place of ;; causes the shell to test the next pattern list in the statement, if any, and execute any associated list on a successful match.
前任。给定
$ cat myscript
#!/bin/bash
NOW=$(date -d "$1" +"%a")
case $NOW in
Mon)
echo "Mon";;
Tue|Wed|Thu|Fri)
echo "Tue|Wed|Thu|Fri";;&
Fri|Sat|Sun)
echo "Fri|Sat|Sun";;
*) ;;
esac
然后
$ ./myscript thursday
Tue|Wed|Thu|Fri
$ ./myscript friday
Tue|Wed|Thu|Fri
Fri|Sat|Sun
$ ./myscript saturday
Fri|Sat|Sun
有关详细信息(包括其他 shell 中的等效内容),请参阅
答案2
不,case 语句的基本结构是仅执行一个匹配的段。除了你拒绝的失败。此外,它仅适用于某些 shell,而不是所有 shell,并且具有特定于每个 shell 的语法。失败的 Bash 语法是;;&
。在 ksh 或 zsh 中,唯一可用的;&
不执行下一个测试,仅直接执行该段(将打印 中所有情况的两行Tue|Wed|Thu|Fri
)。
case 的唯一选择是将其分割为以下两行:
esac
case $now in
像这样(请!请保留环境变量的大写变量):
#!/bin/bash
now=$(date +"%a")
case $now in
Mon)
echo "Mon";;
Tue|Wed|Thu|Fri)
echo "Tue|Wed|Thu|Fri";;
esac
case $now in
Fri|Sat|Sun)
echo "Fri|Sat|Sun";;
*) ;;
esac
答案3
另一种选择:使用函数。
$ cat tt
#!/bin/bash
mon() { echo " Mon" ; }
tue_fri() { echo " Tue|Wed|Thu|Fri" ; }
fri_sun() { echo " Fri|Sat|Sun" ; }
now=$(date +"%a")
[[ $1 != "" ]] && now=$1 # use for testing
case $now in
Mon) mon ;;
Tue|Wed|Thu) tue_fri ;;
Fri) tue_fri; fri_sun ;;
Sat|Sun) fri_sun ;;
*) echo " ERROR" ;;
esac
并测试
$ for f in Mon Tue Wed Thu Fri Sat Sun bla ;do echo "$f"; tt "$f"; done
Mon
Mon
Tue
Tue|Wed|Thu|Fri
Wed
Tue|Wed|Thu|Fri
Thu
Tue|Wed|Thu|Fri
Fri
Tue|Wed|Thu|Fri
Fri|Sat|Sun
Sat
Fri|Sat|Sun
Sun
Fri|Sat|Sun
bla
ERROR