数组在循环内更新,但循环外部为空

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组在循环内更新,但循环外部为空相关的知识,希望对你有一定的参考价值。

我尝试以下一种方式定义数组:

#!/bin/bash

function try {
local arr=()
    sort -n a.txt | while read line; do
        arr=("${arr[@]}" "${line}")
        declare -p arr
    done
declare -p arr
}

try

我得到一个奇怪的事情 - 在while期间阵列更新,一切都很好。但是在while循环之外我得到的是arr是空的。

这里发生了什么?


编辑:在第一个答案之后,用这种方式(没有像他的建议那样的管道):

#!/bin/bash

function try {
local arr=()
    while read line; do
        arr+=("${line}")
        declare -p arr
    done < "`sort -n a.txt`"
declare -p arr
}

try
答案

这样做(需要bash):

#!/usr/bin/env bash

# declare an array
arr=()

# loop through results of sort and populate an array
while read -r line; do
   arr+=( "$line" )
done < <(sort -n a.txt)

# Check array content
declare -p arr
  • 不要使用管道来避免分支子壳,而是使用process substitution。在父shell中看不到子shell中所做的更改。
  • 使用array+=(item)语法将项附加到数组

请注意,使用bash你也可以使用mapfile并避免使用while循环:

mapfile -t arr < <(sort -n a.txt)

以上是关于数组在循环内更新,但循环外部为空的主要内容,如果未能解决你的问题,请参考以下文章

汇编学习:二维数组遍历

如何使用带有串行内循环的openMP并行化外循环以进行数组添加

数组为空,for循环后未添加数据

Laravel:当数组为空时数组循环的集合

从prop更新更新状态将导致循环错误

选择排序,但每次迭代只有一个开关