如何修改bash函数中-u参数匹配模式以区分-u与-uNUM
Bash中精准匹配
-uNUM格式的模式修改方案 问题背景
我编写了一个Bash函数,用于处理-u相关的四种用法:
-u:单独触发用法说明的选项-u NUM:选项后跟空格分隔的数字参数-u=NUM:选项后跟等号连接的数字参数-uNUM:选项直接拼接数字参数(无分隔符)
其中nmafr是用于验证参数是否为整数的工具函数。当前代码里的("-u"*)模式会匹配所有以-u开头的参数,包括单独的-u,导致本该由("-u"|"--usage")分支处理的单独-u被错误拦截。需要修改该模式,使其仅匹配-u后至少跟一个字母数字字符的情况(即-uNUM格式)。
解决方案
将原有的("-u"*)模式替换为("-u"[[:alnum:]]*)即可。
模式说明
[[:alnum:]]是Bash标准字符类,代表任意字母(大小写)或数字,等价于[a-zA-Z0-9]- 该模式要求
-u后必须紧跟至少一个字母/数字字符,因此只会匹配-uNUM这类格式,不会匹配单独的-u
修改后的完整代码
local AFFNUM="nmafr -q -W" while (( $# > 0 )); do case $1 in ("-u"|"--usage") ## 处理 -u NUM 格式,-u 允许可选参数值 if { $AFFNUM "$2"; }; then usg="$2" ; shift ; shift else usg=1 ; shift 1 fi lampi-usage "$usg" return 0 ;; ("-u="*|"--usage="*) ## 处理 "-u=2"、"-u=" 格式,允许可选参数值 if { $AFFNUM "${1#*=}"; }; then usg="${1#*=}" ; shift 1 else usg=1 ; shift 1 fi lampi-usage "$usg" return 0 ;; ("-u"[[:alnum:]]*) ## 处理 -uNUM 格式 if { $AFFNUM "${1#*-u}"; }; then usg="${1#*-u}" ; shift 1 else shift 1 lferr+=({-uNUM} NUM fails numeric validation) fi lampi-usage "$usg" return 0 ;; ("--") shift 1 ; break ;; (*) opt_error=1 ; break ;; esac done
内容的提问来源于stack exchange,提问作者Dilna
相关产品推荐
相关产品推荐

