我想知道如何最好地实现一个参数$x
,比如说$7
——我的意思是参数丰富的函数的最后一个参数——这将充当“将各种关键数据放在这里以停止添加更多参数”?可能的调用可能是:afunction param1 param2 ... "MYDATA=1 OTHERDATA=true"
。我需要将一些数据上的一堆简单标记传递给函数,并且不需要为它们保留位置参数,特别是因为某些标记是可选的,不能分配给函数签名中的固定位置。
更新:
Zsh 解决方案示例可以是:afunc ...normal parameters... "MYDATA:1:OTHERDATA:2:"
然后:local mydata="${7/(#b)*MYDATA:([^:]#):*/$match[1]}"
。我可以编写一个函数来隐藏复杂的模式代码,它的工作原理如下get_key "$7" "MYDATA"; local mydata=$REPLY
:该解决方案有效,但我真的想研究这个并找到以特定方式最好或有用的解决方案。
答案1
使用循环和 处理(其余)参数shift
。对于KEY=VALUE
类型参数,类似这样(在 bash 中):
function foo {
shift # handle the first "fixed" arg
while [ -n "$1" ] ; do
key=${1%%=*}
val=${1#*=}
echo "key: $key value: $val"
shift
done
}
foo first MYDATA=2 OTHERDATA=false
或者,您可以使用getopts
(bash 内置)来解析-x
样式标志:
function bar {
OPTIND=3 # skip first two args
local opt
while getopts "ab:" opt; do
if [ "$opt" = "a" ] ; then
echo flag -a encountered
elif [ "$opt" = "b" ] ; then
echo flag -b with arg $OPTARG
fi
done
}
bar fixed args -a -b foo