Re: Bash 3.2.25 not expanding subscript...

2008-02-12 Thread Bernd Eggink

Brad Diggs schrieb:


In short the bug is the result of failure to expand the
subscript of an array if the subscript is a variable.
The following script should return a list of files with a 
preceding (File #: ).  However, it does not work that 
way because the integer variable (${d}) used in the subscript
of the array statement (FileList[${d}]=${File}) does not get 
properly expanded.


#!/bin/bash
declare -a FileList=('')
declare -i d=0

ls -1| while read File
do
   FileList[${d}]=${File}
   d=$((10#${d}+1))
done


This is normal bash behaviour, see FAQ E4. As bash executes _all_ parts 
of a pipe in subshells (in contrast to ksh, where the last component is 
executed in the current shell), the variable 'FileList' being assigned 
here is local to the subshell. After the loop the variable 'FileList' 
declared in line 1 (which happens to have the same name, but that 
doesn't matter) is unchanged.


Try this instead:

while read File
do
   FileList[d]=$File
   (( d=d+1 ))
done $(ls -1)

Greetings,
Bernd

--
Bernd Eggink
[EMAIL PROTECTED]
http://sudrala.de




Re: Bash 3.2.25 not expanding subscript...

2008-02-12 Thread Brad Diggs
Bernd,

Thank you so very much!!!  I would have never figured that out
on my own.  I went back to the Advanced Bash Scripting Guide 
(by Mendel Cooper) to see if this example would make a good 
addition.  Searching on your use of Here Strings (e.g. ). 
I found on page 326 (18.1. Here Strings) a the following method 
that also works quite well.

read -r -a FileList  $(ls -1)

I wish that I had noticed the Here Strings feature before.  That
is a great feature.

Thank you both for your time and contributions!

Regards
Brad

Reference:
Advanced Bash Scripting Guide
http://personal.riverusers.com/~thegrendel/abs-guide.pdf

On Tue, 2008-02-12 at 10:13 +0100, Bernd Eggink wrote:
 Brad Diggs schrieb:
 
  In short the bug is the result of failure to expand the
  subscript of an array if the subscript is a variable.
  The following script should return a list of files with a 
  preceding (File #: ).  However, it does not work that 
  way because the integer variable (${d}) used in the subscript
  of the array statement (FileList[${d}]=${File}) does not get 
  properly expanded.
  
  #!/bin/bash
  declare -a FileList=('')
  declare -i d=0
  
  ls -1| while read File
  do
 FileList[${d}]=${File}
 d=$((10#${d}+1))
  done
 
 This is normal bash behaviour, see FAQ E4. As bash executes _all_ parts 
 of a pipe in subshells (in contrast to ksh, where the last component is 
 executed in the current shell), the variable 'FileList' being assigned 
 here is local to the subshell. After the loop the variable 'FileList' 
 declared in line 1 (which happens to have the same name, but that 
 doesn't matter) is unchanged.
 
 Try this instead:
 
   while read File
   do
  FileList[d]=$File
  (( d=d+1 ))
   done $(ls -1)
 
 Greetings,
 Bernd

-- 
The Zone Manager
http://TheZoneManager.COM
http://opensolaris.org/os/project/zonemgr