我编写了一个简单的脚本,它匹配以破折号开头的位置参数,并将它们保存到一个关联数组中.
declare -A opts
for i; do
[[ "$i" =~ - ]] && opts[$i]=1
done
shift "${#opts[*]}"
echo "opts: ${opts[*]}"
echo "!opts: ${!opts[-d]}"
echo "Query: $*"
对于调用./script -d hello world
,输出为:
opts: 1
!opts: hello
Query: hello world
这是意想不到的,因为如果定义了${!opts[-d]}
的关键字,它本身就应该是-d
.此行为是由Shift命令引起的,当从代码中删除该命令时,输出将如预期:
opts: 1
!opts: -d
Query: -d hello world
为什么Shift键会干扰创建的关联数组?