*BSD News Article 10220


Return to BSD News archive

Received: by minnie.vk1xwt.ampr.org with NNTP
	id AA7478 ; Fri, 22 Jan 93 11:45:33 EST
Xref: sserve comp.bugs.4bsd:1929 comp.unix.bsd:10279
Newsgroups: comp.bugs.4bsd,comp.unix.bsd
Path: sserve!manuel.anu.edu.au!munnari.oz.au!uunet!spool.mu.edu!yale.edu!ira.uka.de!smurf.sub.org!flatlin!bad
From: bad@flatlin.ka.sub.org (Christoph Badura)
Subject: fix for ash's (/bin/sh) for loop parsing (NET2/386BSD)
Organization: Guru Systems/Funware Department
Date: Thu, 21 Jan 1993 16:55:14 GMT
Message-ID: <C17r03.8up@flatlin.ka.sub.org>
Summary: "for variable do" was rejected by parser
Lines: 125

Subject: sh(1) bombs on "for var do ..."
Index:	bin/sh/parser.c, bin/sh/sh.1

Description:
	When using the
	     for var do
		 ...
	     done
	variant of the for statement the shell complains about a
	syntax error.
Repeat-By:
	/bin/sh
	$ for foo do
	Syntax error: word unexpected
	$ ^D
Fix:

*** parser.c,1	Tue Apr 16 02:23:22 1991
--- parser.c	Thu Jan 21 00:47:55 1993
***************
*** 326,331 ****
--- 326,333 ----
  			}
  			*app = NULL;
  			n1->nfor.args = ap;
+ 			if (lasttoken != TNL && lasttoken != TSEMI)
+ 				synexpect(-1);
  		} else {
  #ifndef GDB_HACK
  			static const char argvars[5] = {CTLVAR, VSNORMAL|VSQUOTE,
***************
*** 337,345 ****
  			n2->narg.backquote = NULL;
  			n2->narg.next = NULL;
  			n1->nfor.args = n2;
  		}
- 		if (lasttoken != TNL && lasttoken != TSEMI)
- 			synexpect(-1);
  		checkkwd = 2;
  		if ((t = readtoken()) == TDO)
  			t = TDONE;
--- 339,346 ----
  			n2->narg.backquote = NULL;
  			n2->narg.next = NULL;
  			n1->nfor.args = n2;
+ 			tokpushback++;
  		}
  		checkkwd = 2;
  		if ((t = readtoken()) == TDO)
  			t = TDONE;

And this is for the man page.

*** sh.1,1	Tue Apr 16 02:23:25 1991
--- sh.1	Thu Jan 21 00:51:54 1993
***************
*** 223,234 ****
  .I for
  command looks like
  .d
! \fBfor\fR variable \fBin\fR word...
  \fBdo\fR	list
  \fBdone\fR
  .e
  The words are expanded, and then the list is executed repeatedly with
! the variable set to each word in turn.
  .B do
  and
  .B done
--- 223,236 ----
  .I for
  command looks like
  .d
! \fBfor\fR variable [\fBin\fR word... ]
  \fBdo\fR	list
  \fBdone\fR
  .e
  The words are expanded, and then the list is executed repeatedly with
! the variable set to each word in turn. If \fBin\fR word ... is omitted
! .B in
! \&"$@" is assumed.
  .B do
  and
  .B done
***************
*** 254,260 ****
  loops.
  .I Continue
  continues with the next iteration of the
! .IRnum'th
  innermost loop.
  These are implemented as builtin commands.
  .PP
--- 256,262 ----
  loops.
  .I Continue
  continues with the next iteration of the
! .IR num'th
  innermost loop.
  These are implemented as builtin commands.
  .PP
***************
*** 625,631 ****
  none of them has met with universal approval.  The convention used by
  \fIash\fR and all the programs included in the \fIash\fR distribution is
  as follows:
! .ta 1i,2i
  .nf
  	0	Success.
  	1	Alternate success.
--- 627,633 ----
  none of them has met with universal approval.  The convention used by
  \fIash\fR and all the programs included in the \fIash\fR distribution is
  as follows:
! .ta 1i 2i
  .nf
  	0	Success.
  	1	Alternate success.


-- 
				Christoph Badura  ---  bad@flatlin.ka.sub.org

Personally, I don't care whether someone is cool enough to quote Doug
Gwyn--I only care whether Doug Gwyn is cool enough to quote. -- Larry Wall