You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 16:01:02