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,你是绝对正确的,因为我编辑了我的答案,明确地说(但用不同的词),以期待你的评论。