From owner-freebsd-questions@FreeBSD.ORG Sun Oct 16 18:11:23 2005 Return-Path: X-Original-To: freebsd-questions@freebsd.org Delivered-To: freebsd-questions@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id E5C1B16A41F for ; Sun, 16 Oct 2005 18:11:22 +0000 (GMT) (envelope-from ecrist@secure-computing.net) Received: from uno.jonsouer.com (jonsouer.com [70.58.238.233]) by mx1.FreeBSD.org (Postfix) with ESMTP id 7844543D60 for ; Sun, 16 Oct 2005 18:11:20 +0000 (GMT) (envelope-from ecrist@secure-computing.net) Received: from [192.168.1.50] (snipe.secure-computing.net [216.243.161.77]) (authenticated bits=0) by uno.jonsouer.com (8.13.3/8.13.3) with ESMTP id j9GILUhC095522; Sun, 16 Oct 2005 13:21:31 -0500 (CDT) (envelope-from ecrist@secure-computing.net) In-Reply-To: <435189CD.8080606@mykitchentable.net> References: <435027A3.8000908@mykitchentable.net> <35c231bf0510141524u133f2d1bkeb46d60e112ee413@mail.gmail.com> <435189CD.8080606@mykitchentable.net> Mime-Version: 1.0 (Apple Message framework v734) Content-Type: text/plain; charset=US-ASCII; delsp=yes; format=flowed Message-Id: <6E740E3C-53C9-4FFD-BE4B-935D5471507E@secure-computing.net> Content-Transfer-Encoding: 7bit From: Eric F Crist Date: Sun, 16 Oct 2005 13:10:58 -0500 To: Drew Tomlinson X-Mailer: Apple Mail (2.734) Cc: David Kirchner , FreeBSD Questions Subject: Re: Help Understanding While Loop X-BeenThere: freebsd-questions@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: User questions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 16 Oct 2005 18:11:23 -0000 On Oct 15, 2005, at 5:59 PM, Drew Tomlinson wrote: > On 10/14/2005 3:24 PM David Kirchner wrote: > > >> On 10/14/05, Drew Tomlinson 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 IIRC, you can do that be appending a '-x' after #!/bin/sh. Your first line would look like this: #!/bin/sh -x This will result in the script echoing all of the commands as they're executed. As far as the count problem, try declaring the variable before the while loop. For example: doit = 0 count = 0 while [ $doit -lt 4 ] do count=$[$count+1] doit=$[$doit+1] done echo $count HTH _______________________________________________________ Eric F Crist "I am so smart, S.M.R.T!" Secure Computing Networks -Homer J Simpson