我在 zparseopts 中发现了错误还是我做错了
Have I found a bug in zparseopts or am I doing this wrong
今天下午我完成了对 document/solve zparseopts 的任务。我想我发现了 -K 选项的错误 - 或者我称之为 -KillYourself。
我认为 -K 没有正确处理标志选项。输出将先前存在的 key/value 对的二分之一偏向左侧,如下所示。
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 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 ->
=====
flag=1 key=greg
带-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
内置函数通常更容易显示变量值:
typeset -p pargs paargs
(元注释:我们需要 zparseopts
标签吗?)
今天下午我完成了对 document/solve zparseopts 的任务。我想我发现了 -K 选项的错误 - 或者我称之为 -KillYourself。
我认为 -K 没有正确处理标志选项。输出将先前存在的 key/value 对的二分之一偏向左侧,如下所示。
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 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 ->
=====
flag=1 key=greg
带-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
内置函数通常更容易显示变量值:
typeset -p pargs paargs
(元注释:我们需要 zparseopts
标签吗?)