bash - 案例...esac 默认条件
问题描述
我第一次使用getopts
和case...esac
。我已经看到教程和问题有许多不同模式的默认/全能选项:?
, *
, \?
, [?]
. 它们的功能似乎都相同,您可以在此脚本中更改它们的顺序:
#!/bin/bash
set -e
set -u
set -o pipefail
while getopts ":d:l:h:" opt; do
case $opt in
d) echo getopts saw $opt with value $OPTARG ;;
l) echo getopts saw $opt with value $OPTARG ;;
h) echo getopts saw $opt with value $OPTARG ;;
:) echo "getopts saw $opt with value $OPTARG and went to :" ;;
*) echo "getopts saw $opt with value $OPTARG and went to *" ;;
?) echo "getopts saw $opt with value $OPTARG and went to ?" ;;
\?) echo "getopts saw $opt with value $OPTARG and went to \?" ;;
[?]) echo "getopts saw $opt with value $OPTARG and went to [?]" ;;
esac
done
echo script done
运行下面的代码将始终在case
列表中的第一个匹配选项处停止:
$ ./test.sh -c
getopts saw ? with value c and went to *
script done
所有这些都完全相同吗?
回应@BenjaminW. 的评论:下面的手动引用解释了getopts
将返回?
vs:
取决于是否getopts
设置为静默。所以我修改后的问题是:
?
,\?
, 和[?]
等价的吗?- 是
*
不必要的吗?
从手册中:如果未找到所需的参数,并且 getopts 不是静默的,则在名称中放置一个问号 ('?'),未设置 OPTARG,并打印一条诊断消息。如果 getopts 是静默的,则在 name 中放置一个冒号 (':'),并将 OPTARG 设置为找到的选项字符。
解决方案
只有*
是 的默认值case
。
其他人在此脚本中工作的原因是因为您正在处理getopts
结果。它为参数中未列出的任何选项设置$opt
为,并且您已经明确处理了所有这些选项。?
getopts
但是,如果您正在处理更一般的数据,您将无法?
用作默认情况。
推荐阅读
- botframework - 使用 DirectLine javascript 连接两个机器人
- rust-cargo - 如何指定cargo单独依赖的github地址?
- phoenix-live-view - 在 Phoenix Live View 中,删除项目会删除 phx-hook 放置的 DOM 元素
- javascript - 视图构造中的反应方法
- python - 如何获取变量的斜率并从存储的(使用 python pickle 序列化)ML 模型中截取
- javascript - 来自方法的未定义对象的返回值
- jquery - 如何在 MVC 和 Jquery 中使用 Render View Partial 方法下载多个 pdf?
- python - Pygame - 跳跃动画过快
- numbers - 有没有办法将范围之间的任何数字转换为 0-1 之间的浮点数?
- django-models - 在 django 使用内部连接模型时表不存在错误