Date: Wed, 15 Jul 2009 12:58:39 -0500 From: Jay Hall <jhall@socket.net> To: Dan Nelson <dnelson@allantgroup.com> Cc: Bryan Venteicher <bryanv@daemoninthecloset.org>, freebsd-questions@freebsd.org Subject: Re: Bash and arrays Message-ID: <CC2CF886-C52B-442E-B863-D7113722799D@socket.net> In-Reply-To: <20090715055305.GG63413@dan.emsphone.com> References: <4A48C83B-A36C-417F-9F68-F1CB1BCDDC8F@socket.net> <142219524.01247634136492.JavaMail.root@bayleaf> <20090715055305.GG63413@dan.emsphone.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Jul 15, 2009, at 12:53 AM, Dan Nelson wrote: > In the last episode (Jul 15), Bryan Venteicher said: >>> I thought I understood how arrays work in bash, but I have been >>> proven >>> wrong. I am reading lines from a file and placing them in an array. >>> However, when I am finished, the array has a length of 0. >>> >>> Following is the code I am using. >>> >>> #!/usr/local/bin/bash >>> COUNTER=0 >>> cat ./test_file.txt | while read LINE >>> do >>> echo ${LINE} >>> FOO[${COUNTER}]=${LINE} >>> COUNTER=`expr ${COUNTER} + 1` >>> done >>> >>> echo ${#FOO[@]} >>> echo ${#FOO[*]} >>> >>> >>> And, here is the output. >>> >>> test_file >>> file_size >>> 0 >>> 0 >>> >>> Thanks in advance for any help you can offer. >> >> The right hand side of the pipe is running in its own subshell so >> it has its own copy of FOO. >> >> One fix is >> #!/usr/local/bin/bash >> COUNTER=0 >> while read LINE >> do >> echo ${LINE} >> FOO[${COUNTER}]=${LINE} >> COUNTER=`expr ${COUNTER} + 1` >> done < ./test_file.txt > > Another alternative would be to use zsh, which makes sure that the > last > component of a pipeline is run in the current shell process so the > original > script would have worked. > > -- > Dan Nelson > dnelson@allantgroup.com > Thanks to everyone for their help. I had forgotten the right side of the pipe runs in its own subshell. Jay
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CC2CF886-C52B-442E-B863-D7113722799D>