Zsh 未设置存储在另一个变量中的变量名会导致错误

Zsh 未设置存储在另一个变量中的变量名会导致错误,zsh,Zsh,为什么会出现以下情况 MY_VARS="VAR1 VAR2 VAR3" unset "$MY_VARS" 给我一个错误 unset: VAR1 VAR2 VAR3: invalid parameter name TL;DR使用数组我的变量=(VAR1 VAR2 VAR3);取消设置“${MY_VARS[@]}” 您正在尝试取消设置名为VAR1 VAR2 VAR3的单个变量,而不是名为VAR1、VAR2和VAR3的三个变量 如果zsh在默认情况下对无引

为什么会出现以下情况

MY_VARS="VAR1 VAR2 VAR3"
unset "$MY_VARS"
给我一个错误

unset: VAR1 VAR2 VAR3: invalid parameter name

TL;DR使用数组<代码>我的变量=(VAR1 VAR2 VAR3);取消设置“${MY_VARS[@]}”


您正在尝试取消设置名为
VAR1 VAR2 VAR3
的单个变量,而不是名为
VAR1
VAR2
VAR3
的三个变量

如果
zsh
在默认情况下对无引号的参数展开执行了单词拆分,则可以编写

unset $MY_VARS
但事实并非如此。您可以使用

setopt SH_WORD_SPLIT
unset $MY_VARS
或者仅为这一个扩展启用它(如oguz ismail在评论中所示)

但是,“正确”的方法是使用数组

MY_VARS=(VAR1 VAR2 VAR3)
unset "${MY_VARS[@]}"

抱歉,它似乎是针对
zsh
的。重新标记并修复了没有双引号的打字错误,是的,它在这里工作得很好<代码>我的变量=(VAR1 VAR2 VAR3);取消设置“${MY_VARS[@]}”也可以。哦,好的。删除了注释,因为它现在不相关。使用数组适用于
zsh
。不知道为什么会有差异。如果你把你的评论转换成回答,我会接受的。如果您知道发生这种情况的原因,则更好:默认情况下,DApparently zsh不会对变量扩展产生的字符串执行分词
unset${=MY_VARS}
有效,变量名前的等号强制分词。我对zsh了解不多,所以我认为我无法给出一个好的答案。谢谢
MY_VARS=(VAR1 VAR2 VAR3)
unset "${MY_VARS[@]}"