[vox-tech] Bash scripting newbie - need syntax help

Mark K. Kim vox-tech@lists.lugod.org
Wed, 28 Apr 2004 22:38:48 -0700 (PDT)


Why not just do the other way Foo suggested?:

   find -iname \erro*.[1-4].[1-4] -exec rm -f \{} \;

-Mark?


On Wed, 28 Apr 2004, Larry Ozeran wrote:

> Thanks for the great discussion. I really appreciate everyone's ideas.
> Unfortunately, it appears that find is using similar expansion of the *
> leading to the same error.
>
> [root@localhost mailman]# find -iname \erro*.[1-4].[1-4] -print0 | xargs
> -r0 rm -f
> bash: /usr/bin/find: Argument list too long
>
> [root@localhost mailman]# find -iname \erro*.[1-4] -print0 | xargs -r0 rm=
 -f
> bash: /usr/bin/find: Argument list too long
>
> So, it appears I will have to use recursion (though I may have
> misunderstood Bill's alternate suggestion for using xargs). Using Foo's
> corrections, I changed to the following, but have a new syntax error.
>
> for ((i=3D1; i<5; i++)); do
>   echo $i $1
>   until rm -f $1.$i || exec bigerase $1.$i;
>   done
>   echo -n =3D
> done
>
> [root@localhost mailman]# source bigerase error
> bash: bigerase: line 6: syntax error near unexpected token `done'
> bash: bigerase: line 6: `  done'
>
> I reread the man page _again_ and enclose the main parts here to ask:
> What did I misread here?
>        for (( expr1 ; expr2 ; expr3 )) ; do list ; done
>               First, the arithmetic expression expr1 is evaluated
>               according to the rules described below under ARITH=AD
>               METIC EVALUATION.  The arithmetic expression  expr2
>               is  then evaluated repeatedly until it evaluates to
>               zero.  Each time  expr2  evaluates  to  a  non-zero
>               value,  list is executed and the arithmetic expres=AD
>               sion expr3 is  evaluated.   If  any  expression  is
>               omitted,  it  behaves as if it evaluates to 1.  The
>               return value is the exit status of the last command
>               in  list  that  is executed, or false if any of the
>               expressions is invalid.
>        until list; do list; done
>               The while command continuously executes the do list
>               as long as the last command in list returns an exit
>               status of zero.  The until command is identical  to
>               the while command, except that the test is negated;
>               the do list is executed as long as the last command
>               in  list  returns a non-zero exit status.  The exit
>               status of the while and until commands is the  exit
>               status  of  the  last  do list command executed, or
>               zero if none was executed.
>
> Do I need curly braces (or something) to notify bash there is an
> embedded control loop? It looks to me like I need both 'done'
> statements. I feel like this is a really dumb mistake, but hopefully the
> context of the problem is interesting to the group.
>
> Thanks again,
>
> Larry
>
> *********** REPLY SEPARATOR  ***********
>
> On 4/28/04 at 12:11 AM Foo Lim wrote:
>
> >On Tue, 27 Apr 2004, Larry Ozeran wrote:
> >
> >> Hi all -
> >>
> >> [...]
> >>
> >> [root@localhost mailman]# rm -f error.*
> >> bash: /bin/rm: Argument list too long
> >>
> >> [...]
> >>
> >> The idea is that if it can't erase all files "error.1*" because there
> >are too many, it calls itself again and tries "error.1.1*", and so forth=
=2E
> >>
> >> [...]
> >>
> >> I read through the bash man page 3 times, but couldn't get enough out =
of
> >> it to understand the error message: unexpected Do on line 4. The man
> >> page said the syntax of the for loop was "for ((exp; exp; exp)); do ex=
p;
> >> done", which is what I thought I had.
> >
> >Hi Larry,
> >
> >Try using xargs like this:
> >
> >find . -name "error*" | xargs rm
> >
> >You can also try doing it through the find command like this:
> >
> >find . -name "error*" -exec rm \{} \;
> >
> >Finally, if you still want to get your for loop to work, you should writ=
e
> >your for loop like this:
> >
> >for (( i=3D1; i<5; i++ )); do
> >  echo $i  # sub your own command here
> >done
> >
> >Notice there are no dollar signs in the assignment, the comparison, nor
> >the increment.
> >
> >HTH,
> >Foo
> >
> >_______________________________________________
> >vox-tech mailing list
> >vox-tech@lists.lugod.org
> >http://lists.lugod.org/mailman/listinfo/vox-tech
>
>
>
> _______________________________________________
> vox-tech mailing list
> vox-tech@lists.lugod.org
> http://lists.lugod.org/mailman/listinfo/vox-tech
>
>

--=20
Mark K. Kim
AIM: markus kimius
Homepage: http://www.cbreak.org/
Xanga: http://www.xanga.com/vindaci
Friendster: http://www.friendster.com/user.jsp?id=3D13046
PGP key fingerprint: 7324 BACA 53AD E504 A76E  5167 6822 94F0 F298 5DCE
PGP key available on the homepage