Date: Wed, 15 Jul 2009 00:53:05 -0500 From: Dan Nelson <dnelson@allantgroup.com> To: Bryan Venteicher <bryanv@daemoninthecloset.org> Cc: Jay Hall <jhall@socket.net>, freebsd-questions@freebsd.org Subject: Re: Bash and arrays Message-ID: <20090715055305.GG63413@dan.emsphone.com> In-Reply-To: <142219524.01247634136492.JavaMail.root@bayleaf> References: <4A48C83B-A36C-417F-9F68-F1CB1BCDDC8F@socket.net> <142219524.01247634136492.JavaMail.root@bayleaf>
next in thread | previous in thread | raw e-mail | index | archive | help
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20090715055305.GG63413>