Bash and arrays

Jay Hall jhall at socket.net
Wed Jul 15 17:58:41 UTC 2009


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 at allantgroup.com
>
Thanks to everyone for their help.  I had forgotten the right side of  
the pipe runs in its own subshell.


Jay



More information about the freebsd-questions mailing list