如何在案例陈述中使用模式?
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)
大括号扩展不起作用,但
*
、?
和[]
起作用。如果您设置了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:
我认为你不能使用大括号。
根据 Bash 手册中关于 条件构造 中的情况。
不幸的是,没有关于大括号扩展的信息。
所以你必须做这样的事情:
I don't think you can use braces.
According to the Bash manual about case in Conditional Constructs.
Nothing about Brace Expansion unfortunately.
So you'd have to do something like this:
if
和grep -Eq
其中:
-q
阻止grep
生成输出,它只是产生退出状态-E
启用扩展正则表达式我喜欢这个,因为:
case
不同,一个缺点是可能比
case
慢,因为它调用外部grep
程序,但在使用 Bash 时我倾向于最后考虑性能。case
是 POSIX 7Bash 似乎默认遵循 POSIX,没有 https://stackoverflow.com/a/4555979/895245
这是引用:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01 部分“案例条件构造”:
然后 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13部分“2.13.模式匹配表示法”仅提到
?
,*< /code> 和
[]
。if
andgrep -Eq
where:
-q
preventsgrep
from producing output, it just produces the exit status-E
enables extended regular expressionsI like this because:
case
One downside is that this is likely slower than
case
since it calls an externalgrep
program, but I tend to consider performance last when using Bash.case
is POSIX 7Bash appears to follow POSIX by default without
shopt
as mentioned by https://stackoverflow.com/a/4555979/895245Here is the quote: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01 section "Case Conditional Construct":
and then http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13 section "2.13. Pattern Matching Notation" only mentions
?
,*
and[]
.我已经多次遇到这个问答了,现在这是我的略有不同的观点。
当然我也更喜欢较短的代码。然而......
有效,并且我没有收到 shellcheck 的任何投诉。如果您愿意,您甚至可以将每个模式放在单独的行中,并按字母顺序对它们进行排序。
I came across this Q&A a few times now, here is my slightly different point of view now.
Of course I prefer shorter code too. However...
... works, and I don't get any complaints from shellcheck. You could even put every pattern on a separate line and sort them alphabetically if that pleases you.