Bash
為什麼while循環後數組為空?
我嘗試在 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之間不共享變數。ring
while 循環中的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)