Zsh 我是否在zparseopts中发现了一个bug,或者我做错了

Zsh 我是否在zparseopts中发现了一个bug,或者我做错了,zsh,Zsh,今天下午我完成了一项记录/解决zparseopts的任务。我想我发现了一个带有-K选项的bug——或者我称之为——杀死你自己 我认为-K没有正确处理标志选项。输出将以前存在的键/值对向左倾斜半对,如下所示 BASH/ZSH大师能确保我做得正确吗 具有-K和其他选项和标志的预期行为: Dictionary: --key -> greg --flag -> default -> Mr. Yutz Was Here 具有-K

今天下午我完成了一项记录/解决zparseopts的任务。我想我发现了一个带有-K选项的bug——或者我称之为——杀死你自己

我认为-K没有正确处理标志选项。输出将以前存在的键/值对向左倾斜半对,如下所示

BASH/ZSH大师能确保我做得正确吗

具有-K和其他选项和标志的预期行为:

Dictionary:

--key           -> greg
--flag          -> 
default         -> Mr. Yutz Was Here
具有-K且无其他选项的预期行为:

Dictionary:

default         -> Mr. Yutz Was Here
奇怪的行为:

Dictionary:

--key                   -> greg
--flag                  -> default
Mr. Yutz Was Here       -> 
看起来关联数组向左“碰撞”了半个值

#!/usr/bin/env zsh


declare -a pargs        #numveric index array
declare -A paargs       #associative array - or dictionary

pargs=("Mr. Yutz Was Here")
paargs[default]="Mr. Yutz Was Here"

echo "\n=====\npargs currenty:\n$pargs"
echo "\n=====\npaargs currenty:\n$paargs"

# -K - KILL YOURSELF - and KEEP previous settings like defaults you pumped into the array before processing.  As long as they are not set below.  Then this is meaningless.
#      Seriously....if you use this you will want to kill yourself.  If you have a flag, the Associative array breaks.  Ugh.
#      to recreate bug, run without arguments.  Then run again with --flag --key FooBar.  Delete -K and do it again.
#      The "Dictionary Output will be borked."
# -D - DELETE - pops each item from the input and processes the next element as "the first one" of $1 if you want to be all shelly about it
# -E - NO ERROR - don't stop on an error.  keep going until done or -- is hit
# -a - ARRAY for the results indexed from 1
# -A - DICTIONARY for the results in key / value pairs.  Flags don't have values.  Just "presence"

zparseopts -D -E -a pargs -A paargs -flag -key:

printf "\n=====\nArray of Results:\n\n"

for ((i = 1; i <= $#pargs; i++)) 
do
    echo "item: $i \t-> $pargs[$i]"
done

echo "\n====="

printf "Dictionary:\n\n"
for key value in ${(kv)paargs}
do
    echo "$key \t-> $value"
done
echo "=====\n"

# Flag detection.
printf "flag=%s key=%s\n\n" ${pargs[(I)--flag]} ${paargs[--key]}
printf "%s\n\n" "$*"
带-K的输出:

greg@api:~/projects/test_swarm$ ./zsh_test.sh --flag --key greg

=====
pargs currenty:
1: Mr. Yutz Was Here

=====
paargs currenty:
default: Mr. Yutz Was Here

=====
Array of Results:

item: 1         -> --flag
item: 2         -> --key
item: 3         -> greg

=====
Dictionary:

--key   -> greg
--flag  -> default
Mr. Yutz Was Here       -> 
=====

flag=1 key=greg

问题是关联数组中值的打印输出。尝试将
paargs
for循环替换为以下内容:

printf 'paargs %s: %s\n' "${(kv@)paargs}"
显著的变化是添加了双引号和
@
参数扩展标志
zsh
通常非常宽容地引用,但在某些情况下,它会起到作用

使用
字体显示变量值通常更容易
内置:

typeset -p pargs paargs

(元注:我们需要一个
zparseopts
标签吗?

就是这样!谢谢你的帮助。我要写完我的小教程,把它贴在这里。我支持zparseopts标记。这也是一个很好的提示:typeset-p pargs paargs
typeset -p pargs paargs