带方括号字符串的bash数组

时间:2016-06-29 19:28:32

标签: arrays bash

我想创建一个包含方括号的字符串值的数组。但每次我都不断意外输出。

selections=()
for i in $choices           
do                       
    selections+=("role[${filenames[$i]}]")
done 

echo ${selections[@]}                                                            

如果选择为12,并且数组filenames[1]filenames[2]包含值'A''B'我想要选择用于保存字符串role[A]role[B]

的数组

而我得到的输出只是roles

1 个答案:

答案 0 :(得分:2)

我可以让您呈现的代码产生您想要的输出,具体取决于我分配给变量filenameschoices的值。

首先,我观察到bash索引数组的索引从 0 开始,而不是 1 。如果您使用值12作为数组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[@]}"

输出:

  

角色[A]角色[B]

最后,正如我在评论中观察到的那样,根据您声称的输入(变量值),您的代码无法输出"角色",正如您所声称的那样。如果这实际上是您所看到的,那么它与您提供的代码无关,或者您的输入与您声明的不同。