delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2000/10/10/18:17:46

Mailing-List: contact cygwin-help AT sourceware DOT cygnus DOT com; run by ezmlm
List-Subscribe: <mailto:cygwin-subscribe AT sources DOT redhat DOT com>
List-Archive: <http://sources.redhat.com/ml/cygwin/>
List-Post: <mailto:cygwin AT sources DOT redhat DOT com>
List-Help: <mailto:cygwin-help AT sources DOT redhat DOT com>, <http://sources.redhat.com/ml/#faqs>
Sender: cygwin-owner AT sources DOT redhat DOT com
Delivered-To: mailing list cygwin AT sources DOT redhat DOT com
Date: Tue, 10 Oct 2000 18:12:38 -0400
Message-Id: <200010102212.SAA13461@envy.delorie.com>
From: DJ Delorie <dj AT delorie DOT com>
To: enolte AT campuspipeline DOT com
CC: cygwin AT sources DOT redhat DOT com
In-reply-to: <01aa01c03300$0816c360$c4acb018@home.com>
(enolte AT campuspipeline DOT com)
Subject: Re: getopts missing with latest cygwin
References: <1001010201259 DOT AA89692 DOT SM AT nike DOT ins DOT cwru DOT edu> <20001010162948 DOT D5706 AT cygnus DOT com> <01aa01c03300$0816c360$c4acb018 AT home DOT com>

> Worse than useless :-)

Sigh, I guess I'm just going to have to respond with hard proof, since
everyone who's saying "it can't work!" never bothered to find out what
that kind of program really does.

The purpose of getopt(1) is to accept all the POSIX.1-allowed
conventions, and convert them to something trivial to parse in a
simple shell context.  Of course it can't set environment variables in
it's parent's space; *nothing* can do that.  It's isn't a
100%-compatible-with-builtin replacement.

This example is from Linux's /usr/lib/getopt/parse.bash:

#!/bin/bash

# A small example program for using the new getopt(1) program.
# This program will only work with bash(1)
# An similar program using the tcsh(1) script language can be found
# as parse.tcsh

# Example input and output (from the bash prompt):
# ./parse.bash -a par1 'another arg' --c-long 'wow!*\?' -cmore -b " very long "
# Option a
# Option c, no argument
# Option c, argument `more'
# Option b, argument ` very long '
# Remaining arguments:
# --> `par1'
# --> `another arg'
# --> `wow!*\?'

# Note that we use `"$@"' to let each command-line parameter expand to a 
# separate word. The quotes around `$@' are essential!
# We need TEMP as the `eval set --' would nuke the return value of getopt.
TEMP=`getopt -o ab:c:: --long a-long,b-long:,c-long:: \
     -n 'example.bash' -- "$@"`

if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi

# Note the quotes around `$TEMP': they are essential!
eval set -- "$TEMP"

while true ; do
	case "$1" in
		-a|--a-long) echo "Option a" ; shift ;;
		-b|--b-long) echo "Option b, argument \`$2'" ; shift 2 ;;
		-c|--c-long) 
			# c has an optional argument. As we are in quoted mode,
			# an empty parameter will be generated if its optional
			# argument is not found.
			case "$2" in
				"") echo "Option c, no argument"; shift 2 ;;
				*)  echo "Option c, argument \`$2'" ; shift 2 ;;
			esac ;;
		--) shift ; break ;;
		*) echo "Internal error!" ; exit 1 ;;
	esac
done
echo "Remaining arguments:"
for arg do echo '--> '"\`$arg'" ; done

--
Want to unsubscribe from this list?
Send a message to cygwin-unsubscribe AT sourceware DOT cygnus DOT com

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019