我第一次使用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
Run Code Online (Sandbox Code Playgroud)
运行下面的代码将始终在case列表中的第一个匹配选项处停止:
$ ./test.sh -c
getopts saw ? with value c and went to *
script done
Run Code Online (Sandbox Code Playgroud)
所有这些都完全一样吗?
回应@BenjaminW. 的评论:下面的手动引用解释了getopts将返回?vs:取决于是否getopts设置为静音。所以我修改后的问题是:
?,\?和[?]相同呢?*不必要的吗?来自手册:如果找不到必需的参数,并且 getopts 不静默,则在名称中放置一个问号 ('?'),未设置 OPTARG,并打印诊断消息。如果 getopts 是无提示的,则在 name 中放置一个冒号 (':'),并将 OPTARG 设置为找到的选项字符。
Only*是 的默认值case。
其他人在此脚本中工作的原因是因为您正在处理getopts结果。它设置$opt于?对未在列出的任何选项getopts的说法,你已经处理所有这些选项明确。
但是,如果您正在处理更一般的数据,则无法将其?用作默认情况。
| 归档时间: |
|
| 查看次数: |
95 次 |
| 最近记录: |