Bash

為什麼while循環後數組為空?

  • March 28, 2016

我嘗試在 bash-4.2 中初始化一個數組:

ring=()
ls -las | tail -n +4 | while read line
> do
> ring+=("$line")
> echo ${ring[-1]}
> done
3924 -rw-r--r-- 1 username group 4015716 Mar 23 15:14 script.jar
4 -rw-r--r-- 1 username group 9 Feb 29 12:40 rec.lst
5541 -rw-r--r-- 1 username group 5674226917 Mar 28 15:25 debug.out
8 -rw-r--r-- 1 username group 6135 Mar 25 12:16 script.class
8 -rw-r--r-- 1 username group 6377 Mar 25 11:57 script.java
8 -rwxr-xr-x 1 username group 4930 Mar 8 15:21 script-0.0.0.sh
8 -rwxr-xr-x 1 username group 6361 Mar 28 15:27 script-0.0.1.sh
echo ${ring[0]}

echo "${ring[0]}"

echo "${ring[@]}"

怎麼了,為什麼我在循環結束後得到空數組?

您的問題是,在管道 ( command1 | command2 | command3 ...) 中,命令在子 shell 中執行。子shell之間或子shell與主shell之間不共享變數。ringwhile 循環中的inring與 main shell 中的不同。

克服這個問題的一種方法是使用程序替換:

while read line;  do  ring+=("$line");  echo ${ring[-1]};  done < <(ls -las|tail -n +4) 

<(command)語法稱為程序替換,並將命令的輸出重定向到命名管道。然後用熟悉的重定向,<就好像它是一個文件一樣。使用時<,沒有子shell,因此ring將設置變數。

請注意,有一個 shell 內置命令可以從文件的行中填充數組:

mapfile -t ring < <(ls -las | tail -n +4)

引用自:https://unix.stackexchange.com/questions/272698