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

时间:2018-03-05 10:17:17

标签: bash shell scripting

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

#!/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

1 个答案:

答案 0 :(得分:0)

这样做(需要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
  • 不要使用管道来避免分支子shell,而是使用process substitution。在子shell中看不到子shell中所做的更改。
  • 使用array+=(item)语法将项附加到数组

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

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