Bash脚本如何限制选项仅接受单个字母且禁止合并选项?
这个问题是因为getopts默认就支持合并选项(比如把-a和-b写成-ab),这是它的内置特性,所以脚本会逐个处理合并后的每个字母。要实现你要的“仅接受单个字母选项,禁止合并”的需求,可以按下面的方式修改脚本:
首先,我们需要先检查所有传入的参数,确保没有出现-后面跟着多个字符的情况;然后修正getopts的选项字符串(你原来的:ap没包含b,所以输入-b会被当成无效选项);最后补上无选项时的处理逻辑。
修改后的完整脚本如下:
#!/bin/bash # 先检查所有参数,禁止合并选项(比如 -ab、-ba 这类格式) for arg in "$@"; do # 匹配以单个'-'开头,且后面至少有两个字符的参数 if [[ $arg =~ ^-[^-].+$ ]]; then echo 'Bad input' >&2 exit 1 fi done # 用getopts处理合法的单个选项 while getopts ":ab" jeep; do case $jeep in a) echo 'Hi Brad' ;; b) echo 'Hi Eddy' ;; \?) echo 'Bad input' >&2 exit 1 ;; esac done # 处理没有传入任何选项的情况 if [[ $OPTIND -eq 1 ]]; then echo 'Hi whoever' fi
关键部分解释:
- 参数检查循环:遍历每个传入的参数,用正则表达式
^-[^-].+$匹配那些以单个-开头、后面跟着多个字符的参数(比如-ab),一旦发现就直接报错退出。 - 修正后的
getopts选项字符串:改成:ab,这样-a和-b都会被识别为合法选项,原来的p在你的需求案例里没用到,所以可以去掉(如果实际需要保留可以加回去)。 - 无选项处理:当
OPTIND等于1时,说明getopts没有处理任何选项(也就是用户没传任何选项参数),这时候输出Hi whoever。
现在测试所有你期望的场景:
$ foo.sh -a→ 输出Hi Brad$ foo.sh -b→ 输出Hi Eddy$ foo.sh→ 输出Hi whoever$ foo.sh -r→ 输出Bad input$ foo.sh -ab→ 输出Bad input$ foo.sh -ba→ 输出Bad input
完全符合你的需求~
内容的提问来源于stack exchange,提问作者leetbacoon
相关产品推荐
相关产品推荐

