Arrays 带方括号字符串的bash数组

Arrays 带方括号字符串的bash数组,arrays,bash,Arrays,Bash,我想用带有方括号的字符串值创建一个数组。但每次我总是得到意想不到的输出 selections=() for i in $choices do selections+=("role[${filenames[$i]}]") done echo ${selections[@]} 如果选择是1和2,并且数

我想用带有方括号的字符串值创建一个数组。但每次我总是得到意想不到的输出

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

echo ${selections[@]}                                                            
如果选择是
1
2
,并且数组
文件名[1]
文件名[2]
包含值
'A'
'B'
我希望选择数组包含字符串
角色[A]
,以及
角色[B]


相反,我得到的输出只是
角色

我可以让您展示的代码产生您想要的输出,或者不产生,这取决于我分配给变量
文件名
选项
的值

首先,我观察到bash索引数组从0开始索引,而不是1。如果使用值
1
2
作为数组
filenames
的索引,并且如果这是一个只有两个元素的索引数组,则可能是
${filenames[2]}
扩展为零。如果像这样初始化
文件名
,则会出现这种情况:

# NOT WHAT YOU WANT:
filenames=(A B)
相反,可以单独分配数组元素,也可以在索引0处添加一个伪值:

# Could work:
filenames=('' A B)
接下来,我对
选择产生怀疑。由于您正在使用数组,我推测您可能已将
选项
初始化为数组,如下所示:

# NOT CONSISTENT WITH YOUR LATER USAGE:
choices=(1 2)
如果展开一个数组值变量而不指定索引,就好像指定了索引
0
。通过上述初始化,
$choices
将扩展到
1
,而不是您想要的
12
。有两种可能性:将
选项初始化为平面字符串:

# 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]


最后,正如我在评论中所观察到的,考虑到您所声称的输入(变量值),您的代码不可能像您所声称的那样输出“角色”。如果您看到的事实就是这样,那么要么它与您提供的代码完全无关,要么您的输入与您声称的不同。

这应该是可行的。你能出示完整的密码吗?对不起,你的说法不可信。您的代码无法生成
角色
作为其输出。也许它只产生了
角色[A]
?否则,您看到的输出根本不是由您当前的代码生成的。@JohnBollinger,它实际上是可信的。想想全球扩张。如果你有
role[abcs]
作为你的结果,并且
roles
存在于磁盘上,那么你可以扩展到
roles
,就像你也可以扩展到
rolea
roleb
@veilig,…。顺便说一句,如果我的理论是准确的,你的bug是令人困惑的,因为你没有充分引用变量扩展。运行代码并修复找到的内容。@CharlesDuffy,而不是OP描述的输入。您在答案中给出的代码是否产生OP想要的输出取决于运行该代码的当前目录中的文件。如果文件名为
roleA
roleB
,则输出将是这些文件的名称,而不是
role[A]
role[B]
;要解决这个问题,您需要修复引号。最后选择数组周围的引号使它起作用。谢谢你的帮助@CharlesDuffy,你是绝对正确的,因为我编辑了我的答案,明确地说(但用不同的词),以期待你的评论。