Bash 不将数组附加到新索引。仅扩展第一个索引

Bash 不将数组附加到新索引。仅扩展第一个索引

我在 bash 中使用数组,并且一个特定数组的行为异常。

我正在使用一个函数并调用一个外部脚本,该脚本返回一个要附加到数组的值,如下所示:

function get_unit_coverage() {

 for sub_unit in "$@"
 do
     extracted_value=$( ./external_script.sh $file $sub_unit )
     my_array+=$extracted_value
 done
}

我向该函数传递一个数组,并期望每次迭代都会附加该数组。

然而,返回:

echo "${my_Array[0]}"

52.5500%66.6400%16.4300%47.8800%40.6600%45.6800%43.3400%74.5100%87.4600%45.6300%65.6100%58.0900%%47.5800%5.9500%7.6500%1.8000%

external_script.sh 只是回显这些值,这是一个潜在的问题吗?

答案1

要将新元素追加到数组中:

array+=( new elements here )

在你的情况下:

my_array+=( "$extracted_value" )

当你这样做时

array+=$variable

您要附加到数组的第一个元素。它是一样的

array[0]+=$variable

另请注意,在

extracted_value=$( ./external_script.sh $file $sub_unit )

$file$sub_unit将在空格上分割并进行文件名通配。为了防止这种情况,请使用"$file"and"$sub_unit"代替(即用双引号引用变量扩展)。

同样,说

my_array+=( $extracted_value )

会将 的值拆分$extracted_value为多个单词,每个单词将进行文件名通配以在数组中生成新元素。这样写会更好(正如已经提到的),

my_array+=( "$extracted_value" )

这是一般建议,没有理由这样做不是执行此操作,无论您是否知道您的值已经是不包含通配符的单个单词。

答案2

您添加到一个字符串并将其作为数组读取(正如 Kusalananda 上面解释的那样)。但你的问题显示了如何将变量视为数组。事实上,一个简单的变量可以很容易地变成一个数组。

$ a+=1
$ a+=2
$ echo "$a"
12
$ echo "${a[0]}"
12
$ a+=(3)
$ echo "$a"
12
$ echo "${a[0]}"
12
$ echo "${a[1]}"
3

相关内容