arrays - Bash 在 while 循环中构建数组(不持久)?

标签 arrays bash loops

<分区>

考虑这个例子,比如说,test.sh:

cat > test.txt <<'EOF'
test 1
test 2
test 3
EOF

declare -a myarr
declare -p myarr  # "declare: myarr: not found"
myarr=()
declare -p myarr  # "declare -a myarr='()'"
#for (( i=1; i<=3; i++ )); do # ok
sed -n 's!test!TEST!p' test.txt | while read i; do # not preserved ?!
  myarr=("${myarr[@]}" "pass $i")
  declare -p myarr
done
declare -p myarr  # "declare -a myarr='()'" ?!

如果我取消注释 for ((... 行,并注释 sed -n ... 行,那么 bash 测试的输出。 sh 符合预期:

test.sh: line 8: declare: myarr: not found
declare -a myarr='()'
declare -a myarr='([0]="pass 1")'
declare -a myarr='([0]="pass 1" [1]="pass 2")'
declare -a myarr='([0]="pass 1" [1]="pass 2" [2]="pass 3")'
declare -a myarr='([0]="pass 1" [1]="pass 2" [2]="pass 3")'

但是,如果我按发布的方式运行脚本,则 myarr 会构建在 while 循环中,但一旦超出循环,它就是空的:

test.sh: line 8: declare: myarr: not found
declare -a myarr='()'
declare -a myarr='([0]="pass TEST 1")'
declare -a myarr='([0]="pass TEST 1" [1]="pass TEST 2")'
declare -a myarr='([0]="pass TEST 1" [1]="pass TEST 2" [2]="pass TEST 3")'
declare -a myarr='()'

那么,为什么 myarr 在这种情况下(在 while 循环中,或者更确切地说,在 while 循环之后)是空的——我如何让它保持它的值?

最佳答案

问题在于,由于使用了管道,您正在 fork 一个子外壳并在子外壳内的数组中填充条目。循环结束后,子 shell 终止,所有更改都在那里丢失。

您可以使用进程替换来避免这种情况:

myarr=()

while IFS= read  -r line; do
   myarr+=("pass $line")
done < <(sed -n 's!test!TEST!p' test.txt)

# examine the result
declare -p myarr

输出:

declare -a myarr=([0]="pass TEST 1" [1]="pass TEST 2" [2]="pass TEST 3")

关于arrays - Bash 在 while 循环中构建数组(不持久)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47215946/

相关文章:

linux - Shell 脚本 - tar 命令将存档名称误认为是目录

c - 回到循环 C 的开始

python - 在 for 循环中使用符号表示计数

Javascript 对象和数组问题

bash - 有人通过命令行使用过 COPASI 吗?

java - 另一种不滥用内存的方法

bash - Shell脚本if语句总是执行else block

python while循环不退出

arrays - Julia 中的等效 np.nanquantile 吗?

c - 程序多次接受最后一行