如何在案例陈述中使用模式?
man
页面显示 case
语句使用“文件名扩展模式匹配”。
我通常希望某些参数有简短的名称,所以我尝试:
case $1 in
req|reqs|requirements) TASK="Functional Requirements";;
met|meet|meetings) TASK="Meetings with the client";;
esac
logTimeSpentIn "$TASK"
我尝试了像 req*
或 me{e,}t
这样的模式,我知道它们会正确扩展以匹配这些值在文件名扩展的上下文中,但它不起作用。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(4)
if
和 grep -Eq
arg='abc'
if printf '%s' "$arg" | grep -Eq 'a.c|d.*'; then
echo 'first'
elif printf '%s' "$arg" | grep -Eq 'a{2,3}'; then
echo 'second'
fi
其中:
-q
阻止grep
生成输出,它只是产生退出状态-E
启用扩展正则表达式
我喜欢这个,因为:
- 它是 POSIX 7
- 它 支持扩展正则表达式,与 POSIX
case
不同, - 当情况很少时,语法比 case 语句更简洁
一个缺点是可能比 case
慢,因为它调用外部 grep
程序,但在使用 Bash 时我倾向于最后考虑性能。
case
是 POSIX 7
Bash 似乎默认遵循 POSIX,没有 https://stackoverflow.com/a/4555979/895245
这是引用:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01 部分“案例条件构造”:
条件构造案例应执行与多个模式中的第一个相对应的复合列表(请参阅模式匹配符号)[...]具有相同复合列表的多个模式应由“|”分隔象征。 [...]
案例构造的格式如下:
大小写单词 [(] 模式 1 ) 复合列表 ;; [[(] 模式[ | 模式] ... ) 复合列表 ;;] ... [[(] 模式[ | 模式] ... ) 复合列表] 埃萨克
然后 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13部分“2.13.模式匹配表示法”仅提到?
,*< /code> 和
[]
。
我已经多次遇到这个问答了,现在这是我的略有不同的观点。
我通常想要一些参数的简称
当然我也更喜欢较短的代码。然而......
case $1 in
"req"|"reqs"|"requirements"|"many more"|"strings"| \
"and"|"patterns"|"here")
TASK="Functional Requirements";;
"met"|"meet"|"meetings")
TASK="Meetings with the client";;
esac
有效,并且我没有收到 shellcheck 的任何投诉。如果您愿意,您甚至可以将每个模式放在单独的行中,并按字母顺序对它们进行排序。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
大括号扩展不起作用,但
*
、?
和[]
起作用。如果您设置了shopt -s extglob,那么您还可以使用"="">扩展模式匹配:?()
- 模式出现零次或一次*()
- 模式出现零次或多次+()
- 出现一次或多次模式@()
- 出现一次模式!()
- 除模式之外的任何内容这是一个示例:
Brace expansion doesn't work, but
*
,?
and[]
do. If you setshopt -s extglob
then you can also use extended pattern matching:?()
- zero or one occurrences of pattern*()
- zero or more occurrences of pattern+()
- one or more occurrences of pattern@()
- one occurrence of pattern!()
- anything except the patternHere's an example: