Skip site navigation (1)Skip section navigation (2)
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>