zsh - 我在 zparseopts 中发现了一个错误还是我做错了
问题描述
今天下午我完成了记录/解决 zparseopts 的任务。我想我发现了一个带有 -K 选项的错误 - 或者我称之为 -KillYourself。
我认为 -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 ->
=====
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
标签吗?)
推荐阅读
- c# - 您可以通过扩展方法使类可枚举吗?特别是 System.Range
- java - 电话响铃时弹出显示
- android - 如何动态更改bottomNavigationView中的文本内容
- java - 在禁用访问外部 DTD 的情况下,使用 TransformerFactory 将 XML 转换为字符串时出现问题
- api - API Gateway API 的基于 AWS Cognito 的身份验证
- javascript - Vuejs如何从url或router-link输入时阻止路由参数类型改变
- pdf - 无需 Javascript 即可为 Apple 设备一键复制页面
- bash - Bash:读取输入可用(是否有任何按键?)
- python - 如何使用日期时间和数字条目在此熊猫数据框中创建唯一 ID?
- pandas - 如果此列中的所有值都是特定值,则从数据框中删除列