我正在将变量传递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
我猜你的意思是:
如何检查数组元素是否属于模式,然后是“任何内容”,然后是“数字字符”...您可以使用带有扩展测试括号
-v
和正则表达式运算符的子字符串正则表达式匹配来执行此操作,即。bash
=~
[[ "$element" =~ regex ]]
如何仅提取参数中存储的字符串的数字字符...您可以使用
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
答案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")
它来明确标记选项的结束(这将允许您使用以破折号开头的非选项参数)。