带有方括号字符串的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

我可以让您提供的代码产生您想要的输出,或者不产生,这取决于我分配给变量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[@]}"
输出:

角色[一]角色[B]

最后,正如我在注释中观察到的那样,你的代码不可能像你声称的那样输出"角色",因为你声称它有输入(变量值)。如果这是您所看到的,那么要么它与您所提供的代码根本不相关,要么您的输入与您声称的不同。

最新更新