从数组元素设置局部变量

从数组元素设置局部变量

我正在将变量传递akms给名为的函数sufx。我能够正确捕获第二个数组元素并设置变量fskl

verbiage我希望能够根据 的数值设置变量-v。我该如何为函数做到这一点sufx?目前verbiage只是取一个字符串值。

akms=("-v 3" "INCLUDE")
sufx akms

这是函数

sufx ()
{
  typeset -n _akms="$1"

  ## Capture INCLUDE or EXCLUDE option for grep
  local fskl="" verbiage=0
  for s in "${_akms[@]}"; do
     case $s in
       ("XCL"|"INCL"|"INCLUDE") fskl="INCLUDE" ;;
       ("NCL"|"EXCL"|"EXCLUDE") fskl="EXCLUDE" ;;
       (*) verbiage=${s#*-v} ;;
      esac
  done

}

答案1

我猜你的意思是:

  1. 如何检查数组元素是否属于模式,然后是“任何内容”,然后是“数字字符”...您可以使用带有扩展测试括号-v和正则表达式运算符的子字符串正则表达式匹配来执行此操作,即。bash=~[[ "$element" =~ regex ]]

  2. 如何仅提取参数中存储的字符串的数字字符...您可以使用bash的参数扩展来排除所有非数字字符,例如"${parameter//[^0-9]}"

因此,结合以上两种方法:

$ array=("-v 3" "INCLUDE")

$ for i in "${array[@]}"
  do
  if [[ "$i" =~ "-v".*[0-9]{1,} ]]
    then
    var="${i//[^0-9]}"
    echo "$var"
    echo "$((var+2))"
    fi
  done

# Output:
3
5

或者,使用通配符模式,case ... esac例如:

$ array=("-v 3" "INCLUDE")

$ for i in "${array[@]}"
  do
  case "$i" in
   [-][v]*[0-9] ) var="${i//[^0-9]}" && echo -e "$var\n$((var+2))" ;;
  esac
  done

# Output
3
5

另请参阅可以使用 globbing 来搜索文件内容吗?

答案2

我建议将"-v 3"字符串作为单独的选项字母 + 选项参数传递"-v" "3"。然后,您可以使用 bash shell 的内置选项解析器getopts来处理它们:

sufx ()
{
    typeset -n _akms="$1"

    local verbiage=0 fskl="" 

    ## process option arguments
    local OPTIND=1
    while getopts ':v:' opt "${_akms[@]}"
    do
        case $opt in
            (v) verbiage=$OPTARG
                ;;
            (*) echo "unkown option: $opt" 1>&2
                ;;
        esac
    done
    
    ## process remaining non-option arguments
    for s in "${_akms[@]:$((OPTIND-1))}"
    do
        case $s in
           ("XCL"|"INCL"|"INCLUDE") fskl="INCLUDE"
           ;;
           ("NCL"|"EXCL"|"EXCLUDE") fskl="EXCLUDE"
           ;;
        esac
    done
}

用法变成

akms=("-v" "3" "INCLUDE")

sufx akms

您甚至可以使用akms=("-v" "3" -- "INCLUDE")它来明确标记选项的结束(这将允许您使用以破折号开头的非选项参数)。

相关内容