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

问题描述 投票:2回答:1

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

#!/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 shell scripting
1个回答
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
  • 不要使用管道来避免分支子壳,而是使用process substitution。在父shell中看不到子shell中所做的更改。
  • 使用array+=(item)语法将项附加到数组

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

mapfile -t arr < <(sort -n a.txt)
© www.soinside.com 2019 - 2024. All rights reserved.