Date: Sat, 15 Oct 2005 15:59:25 -0700 From: Drew Tomlinson <drew@mykitchentable.net> To: David Kirchner <dpk@dpk.net> Cc: FreeBSD Questions <freebsd-questions@freebsd.org> Subject: Re: Help Understanding While Loop Message-ID: <435189CD.8080606@mykitchentable.net> In-Reply-To: <35c231bf0510141524u133f2d1bkeb46d60e112ee413@mail.gmail.com> References: <435027A3.8000908@mykitchentable.net> <35c231bf0510141524u133f2d1bkeb46d60e112ee413@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On 10/14/2005 3:24 PM David Kirchner wrote: >On 10/14/05, Drew Tomlinson <drew@mykitchentable.net> wrote: > > >>OK, I've been working on an sh script and I'm almost there. In the >>script, I created a 'while read' loop that is doing what I want. Now I >>want to keep track of how many times the loop executes. Thus I included >>this line between the 'while read' and 'done' statements: >> >>count = $(( count + 1 )) >> >>I've tested this by adding an 'echo $count' statement in the loop and it >>increments by one each time the loop runs. However when I attempt to >>call $count in an 'echo' statement after the 'done', the variable is >>null. Thus I assume that $count is only local to the loop and I have to >>export it to make it available outside the loop? What must I do? >> >> > >Oh yeah, that's another side effect of using the while read method. >Because it's "| while read" it's starting a subshell, so any variables >are only going to exist there. You'd need to have some sort of 'echo' >within the while read, and then | wc -l at the end of the while loop, >or something along those lines. > >The IFS method someone else mentioned, in regards to 'for' loops, >would probably be better all around. So you'd want: > >OLDIFS=$IFS ># Note this is a single quote, return, single quote, no spaces >IFS=' >' > >for i in `find etc` >do >done > >IFS=$OLDIFS > > OK, I've tried this and it does fix the "count" problem. However it messes up another part of the script and I'm trying understand why. I tried to make this script dynamic in that all I would need to do is edit variables set at the top and then not have to worry about all occurrences in the script. Thus I set the following variables: remote_pictures_dir="/multimedia/Pictures" local_pictures_dir="/tv/pictures" find_args="-iname '*.jpg' -or -iname '*.gif'" Then I called the 'find' command as follows: for original in $(/usr/bin/find $remote_pictures_dir $find_args -print) But when I run my script, I get "/usr/bin/find: invalid predicate `-iname '*.jpg' -or -iname '*.gif''". However if I don't try and use $find_args and type the arguments in specifically, the script runs fine. I tried various combinations of quoting and escaping those quotes but can't come up with a combination that works. What is going on? And is there some way to set verbosity so I can see how the shell is expanding the variables? Thanks much, Drew -- Visit The Alchemist's Warehouse Magic Tricks, DVDs, Videos, Books, & More! http://www.alchemistswarehouse.com
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?435189CD.8080606>