从 .bashrc 导出的函数为 case 模式提供了意外的标记

从 .bashrc 导出的函数为 case 模式提供了意外的标记

我正在使用 Ubuntu 18.04 LTS 和 Gnu Bash 5。

我收到以下错误

/bin/bash: printm: line 56: syntax error near unexpected token `('
/bin/bash: printm: line 56: ` +([[:digit:]]))'
/bin/bash: error importing function definition for `printm'

该函数是从我的 .bashrc 导出的。make安装时运行awk并弹出错误。但如果我测试该功能,它的行为没有问题。

以为我可能失踪了;;在模式的末尾。肯定还有其他事情发生。

有人建议使用

shopt -s extglob

但它的使用并没有解决问题

这是代码

printm ()
{
 local sgr=$(tput sgr0)
 local blu=$(tput bold)$(tput setaf 39)
 local grn=$(tput bold)$(tput setaf 46)
 local cyn=$(tput bold)$(tput setaf 51)
 local red=$(tput bold)$(tput setaf 196)
 local mgn=$(tput bold)$(tput setaf 201)
 local org=$(tput bold)$(tput setaf 208)

 local  captr=0  arg=""
 local  opts=""  shortopts=""  longopts=""
 local  vb=1  ctp=""  cn=0  nl=0
  
 captr=0
 for arg in "$@"; do
   if [[ "$arg" == "-v" ]]; then
     captr=1
     continue
   elif (( captr == 1 )); then
     [[ "$arg" =~ ^[[:digit:]]+$ ]] && vb="$arg"
     captr=0 
   fi
 done

 shortopts="Vuhv::H::w::e::"
 shortopts="${shortopts}n::,l::,b,g,c,r,m,o"

 longopts="version,usage,help,verbosity::"
 longopts="${longopts},blu,grn,cyn,red,mgn,org"
 longopts="${longopts},heading::,warning::,error::"

 opts=$( getopt -o "$shortopts" -l "$longopts" -n "${0##*/}" -- "$@" )

 getopt_errcode=$?
 if (( getopt_errcode >= 1 )); then
   printf '%s%s%s\n' $red "Catched getopt_errcode" $sgr
 fi
 
 eval "set -- $opts"
 while (( $# > 0 )); do
   case $1 in
     ("-V"|"--version")
       local -r date="V01 2021 Jul 21 Wk27" 
       printf "%s\n\n" "$date"
       return
       ;;
     ("-u"|"--usage")
       printf '%s\n' "-V, --version, -u, --usage, -h, --help"
       return
       ;;
     ("-h"|"--help")
       return
       ;;
     ("-v"|"--verbosity")
       case "$2" in
         (+([[:digit:]])) vb="$2" ; shift 2 ;;
         (*)              vb=2 ; shift 2 ;;
       esac
       ;;
     ("-n")
       case "$2" in
         (+([[:digit:]])) cn="$2" ; shift 2 ;;
         (*)              cn=208 ; shift 2 ;;
       esac
       nl=1 ; ctp=$(tput bold)$(tput setaf $cn)
       ;;
     ("-l")
       case "$2" in
         (+([[:digit:]])) nl="$2"; shift 2 ;;
         (*)              nl=1 ; shift 2 ;;
       esac
       ;;
     ("-b"|"--blu") ctp="$blu" ; shift ;;
     ("-g"|"--grn") ctp="$grn" ; shift ;;
     ("-c"|"--cyn") ctp="$cyn" ; shift ;;
     ("-r"|"--red") ctp="$red" ; shift ;;
     ("-m"|"--mgn") ctp="$mgn" ; shift ;;
     ("-o"|"--org") ctp="$org" ; shift ;;
     ("-H"|"--heading")
       ctp="$mgn"
       case "$2" in
         (+([[:digit:]]))  nl="$2" ; shift 2 ;;
         (*)               nl=1    ; shift 2 ;;
       esac
       ;;
     ("-w"|"--warning")
       ctp="$blu"
       case "$2" in
         (+([[:digit:]]))  nl="$2" ; shift 2 ;;
         (*)               nl=1    ; shift 2 ;;
       esac
       ;;
     ("-e"|"--error")
       ctp="$red"
       case "$2" in
         (+([[:digit:]]))  nl="$2" ; shift 2 ;;
         (*)               nl=1    ; shift 2 ;;
       esac
       ;;
     ("--") shift ; break ;;
     (*) opt_error=1 ; break ;;
   esac
 done
}

相关内容