我想创建一个数组,其中字符串值具有方括号。但是每次我都得到意想不到的输出
selections=()
for i in $choices
do
selections+=("role[${filenames[$i]}]")
done
echo ${selections[@]}
如果选项是1
和2
,并且数组filenames[1]
和filenames[2]
保存值'A'
, 'B'
,我希望选择数组保存字符串role[A]
和role[B]
我得到的输出只是roles
。
我可以让您提供的代码产生您想要的输出,或者不产生,这取决于我分配给变量filenames
和choices
的值。
1
和2
作为数组filenames
的索引,并且如果这是一个只有两个元素的索引数组,那么${filenames[2]}
可能会扩展为零。如果您像这样初始化filenames
,结果将是:
# NOT WHAT YOU WANT:
filenames=(A B)
相反,要么单独赋值数组元素,要么在索引0处添加一个虚拟值:
# Could work:
filenames=('' A B)
接下来,我怀疑choices
。由于您正在使用数组,我推测您可能已经将choices
初始化为数组,如下所示:
# NOT CONSISTENT WITH YOUR LATER USAGE:
choices=(1 2)
如果你在没有指定索引的情况下展开一个数组值变量,就好像你指定了索引0
。通过上述初始化,$choices
将只扩展为1
,而不是您想要的1 2
。有两种可能:或者将choices
初始化为一个平面字符串:
# Could work:
choices='1 2'
或者展开:
# or expand it this way:
for i in "${choices[@]}"
。顺便说一下,不要忽略引号:特定的形式将扩展到每个数组元素一个单词,但是如果没有引号,数组元素将受到单词分割和其他扩展的影响(尽管对于您在这种情况下使用的特定值来说,这是没有意义的)。
引号通常也适用于您的echo
命令:如果您不引用展开,那么您必须更仔细地分析代码,以确信它将在所有情况下执行您的意图。它不仅会受到单词分割的影响,还会受到路径名扩展和其他一些影响。在您的情况下,可能会执行路径名扩展,具体取决于工作目录中的文件名称(感谢@CharlesDuffy)。直接引用要安全得多。
无论如何,这里是一个完整的演示,包含您的代码,并产生您想要的输出:
#!/bin/bash
filenames=('' 'A' 'B')
choices="1 2"
selections=()
for i in $choices
do
selections+=("role[${filenames[$i]}]")
done
echo ${selections[@]}
# better:
# echo "${selections[@]}"
输出:角色[一]角色[B]
最后,正如我在注释中观察到的那样,你的代码不可能像你声称的那样输出"角色",因为你声称它有输入(变量值)。如果这是您所看到的,那么要么它与您所提供的代码根本不相关,要么您的输入与您声称的不同。