[comp.lang.perl] Bourne Shell

merlyn@iwarp.intel.com (Randal Schwartz) (03/20/90)

In article <22788@adm.BRL.MIL>, rbottin@atl (Richard John Botting) writes:
| I'd like to see a neat solution (other than a "increment.c" program).

If you insist on doing the main looping in sh,

for i in `perl -e '@a=1..20;print"@a";'`
do
	echo $i
done

If you want to just launch stuff quickly,

perl -e 'for $i (1..20) {system "echo $i";}'

Look ma.  No C!

Just another Perl hacker,
-- 
/=Randal L. Schwartz, Stonehenge Consulting Services (503)777-0095 ==========\
| on contract to Intel's iWarp project, Beaverton, Oregon, USA, Sol III      |
| merlyn@iwarp.intel.com ...!any-MX-mailer-like-uunet!iwarp.intel.com!merlyn |
\=Cute Quote: "Welcome to Portland, Oregon, home of the California Raisins!"=/

tneff@bfmny0.UU.NET (Tom Neff) (03/20/90)

Despite all the neat Perl ways to do it, I consider the little
'count' program an important tool for shell programmers.  You
generally just say

	for i in `count 1 100`

or whatever.  Here it is again:

---- cut here --------------------------------------------------------
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
#	Makefile
#	README
#	count.1
#	count.c
# This archive created: Mon Mar 19 14:15:56 1990
export PATH; PATH=/bin:/usr/bin:$PATH
if test -f 'Makefile'
then
	echo shar: "will not over-write existing file 'Makefile'"
else
sed 's/^X//' << \SHAR_EOF > 'Makefile'
X#
X# Makefile for count.  This is a little overkill, but what the heck.
X# (This is public domain too!)
X# Written by:  Jeff Beadles
X# jeff@quark.WV.TEK.COM		...tektronix!quark.wv!jeff
X#
X
XCC = cc
XCFLAGS =
X
X#For the executable file
XBINDIR=/usr/bin
X
Xcount: count.c Makefile
X	$(CC) $(CFLAGS) count.c -o count
X
Xinstall: count
X	-strip count
X	cp count ${BINDIR}/count
X	chmod 755 ${BINDIR}/count
X
X	rm -f *.o core a.out
X
Xclobber: clean
X	rm -f count
X
SHAR_EOF
fi
if test -f 'README'
then
	echo shar: "will not over-write existing file 'README'"
else
sed 's/^X//' << \SHAR_EOF > 'README'
X	count -  By:  Jeff Beadles	jeff@quark.WV.TEK.COM
X
X
X	This program will count from the starting number to the stop
X	number, using the character 'fs' as the field seperator.
X
X	Note, that fs may be in several forms:
X	-A	will use the letter 'A'
X	--	will use a '-' as fs, and
X	-\011	will use a tab (Octal 011) as the fs.  (sh does the expansion.)
X
X	Bugs may be sent to me if desired.
X	Please keep your flames to yourself.  What do you expect for free?
SHAR_EOF
fi
if test -f 'count.1'
then
	echo shar: "will not over-write existing file 'count.1'"
else
sed 's/^X//' << \SHAR_EOF > 'count.1'
X.\"
X.\" @(#)count		1.0	05/09/89
X.\"
X.TH COUNT 1 "09 MAY 1989"
X.UC 4
X.SH NAME
Xcount \- count numbers from a start to a stop point.
X.SH SYNOPSIS
X.B count [-c] start stop
X.SH DESCRIPTION
X.I Count
Xwill count thru an integer sequence of numbers from
X.I Start
Xto
X.I Stop
Xwith a newline after each number.
X
XOptionally,
X.I -c
Xmay be on the command line.  This may be in one of two forms.
X.I -$
Xwill put a 
X.I $
Xbetween each number.
X.I -040
Xwill put a space (Octal
X.I 040
X) between each number.
X
X.SH AUTHOR
XJeff Beadles	jeff@quark.WV.TEK.COM
SHAR_EOF
fi
if test -f 'count.c'
then
	echo shar: "will not over-write existing file 'count.c'"
else
sed 's/^X//' << \SHAR_EOF > 'count.c'
X/*	Count.c  Released into the public domain on 05/09/89
X *	Written by:  Jeff Beadles  jeff@quark.WV.TEK.COM
X *	  or ...!tektronix!quark.WV!jeff
X *
X *	NOTE:  This program is not supported by Tektronix, Inc.
X *
X *	This program will count from the starting number to the stop
X *	number, using the character 'fs' as the field seperator.
X *	Note, that fs may be in several forms:
X *	-A	will use the letter 'A'
X *	--	will use a '-' as fs, and
X *	-\011	will use a tab (Octal 011) as the fs.  (sh does the expansion.)
X *
X *	Bugs may be sent to me if desired.
X *	Please keep your flames to yourself.  What do you expect for free?
X *
X */
X
X
X#include <stdio.h>
X#include <ctype.h>
X
X/*
X *	Default field seperator
X */
X
X#ifndef FS
X#define FS '\n'
X#endif
X
Xint
Xmain(argc,argv)
Xint argc;
Xchar **argv;
X
X{
X	void usage();
X	int oatc();
X	int	start = 0;	/* Start count				*/
X	int	stop  = 0;	/* Stop  count				*/
X	int	pos   = 1;	/* Position in command line for parsing	*/
X	char	fs    = FS;	/* Field Separator			*/
X
X	if ( argc < 2)
X		usage(argv[0]);		/* Does not return */
X
X	if ( argv[1][0] == '-' ) {
X		if ( (isdigit(argv[1][1])) && (strlen(argv[1]) == 4) )
X			fs=oatc(argv[1] + 1);
X			else
X			fs = argv[1][1];
X		pos++;		/* On to the next arg... */
X	}
X	start = atoi(argv[pos++]);	/* Start here, and... */
X
X	if ( argc <= pos)
X		usage(argv[0]);		/* Does not return */
X
X	stop  = atoi(argv[pos]); 	/* Stop here. */
X	if ( start >= stop)		/* Are they brain damaged? */
X	{
X		fprintf(stderr,"Error:  START must be less than STOP\n");
X		exit(-2);
X	}
X
X/*
X   Yes, this is it.  It even prints a '\n' when done, if the fs != '\n' (Wow)
X */
X	while ( start <= stop )
X		printf("%d%c",start++,( (start != stop) ? fs : '\n' ) );
X}
X
X/*
X   Can you figure out this function with no comments?  Sure, you can.
X*/
Xvoid usage(program)
Xchar *program;
X
X{
X	fprintf(stderr,"Usage: %s [ -c] start stop\n",program);
X	exit(-1);
X}
X
X/*
X *	octal ascii to char
X */
X
Xint oatc(str)
Xchar *str;
X	{
X	int retval=0;
X	int pos=0;
X	int tmp=0;
X	int loop;
X	static int table[] = { 1, 8, 64 };   /* Powers of 8, to avoid POW */
X
X
X	for(loop=strlen(str) - 1; loop >= 0; loop--)
X		retval += ( (str[loop] - '0') * table[pos++] );
X
X	return((char)retval);
X}
X
SHAR_EOF
fi
exit 0
#	End of shell archive