Discussion:
getopt, single dash with long options
(too old to reply)
* Tong *
2006-10-03 01:10:12 UTC
Permalink
Hi,

Any way that I can use single dash with long options with getopt(1)?

Eg, when using Perl Getopt::Long, for long option --title, I can abbreviate
it to -t, as long as the abbreviation is not ambiguous. But I found that I
have to use --t for getopt(1). Any way I can use single dash instead?


The getopt(1) man page hinted that I can:

,-----
| For a long option, `--' and the full option name are generated as one
| parameter. This is done regardless whether the option was abbreviated
| or specified with a single `-' in the input. Arguments are handled as
| with short options.
`-----

but I can't find how.

please help/comment.

thanks
--
Tong (remove underscore(s) to reply)
http://xpt.sourceforge.net/
--
Posted via a free Usenet account from http://www.teranews.com
Stephane CHAZELAS
2006-10-03 07:13:44 UTC
Permalink
Post by * Tong *
Hi,
Any way that I can use single dash with long options with getopt(1)?
Eg, when using Perl Getopt::Long, for long option --title, I can abbreviate
it to -t, as long as the abbreviation is not ambiguous. But I found that I
have to use --t for getopt(1). Any way I can use single dash instead?
Note that the UNIX getopt(1) doesn't support long options. Only
the one sometimes found one some Linux distributions that come
from the "util-linux" package does.

see http://stchaz.free.fr/getopts_long for a POSIX
implementation of a getopts (note the s) supporting long options
(as a shell function whose definition you'd have to embed in
yout script).

With util-linux getopt, you need to specify the short options
you want to use along with the long ones.

See the examples provided with util-linux for instance.

(note that the statement below about it working only with bash
is incorrect, it should work with any Bourne or POSIX shell, the
only problem being "echo" being used)

(from util-linux-2.12i/getopt/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
--
Stéphane
Andrew Smallshaw
2006-10-03 18:13:04 UTC
Permalink
Post by * Tong *
Hi,
Any way that I can use single dash with long options with getopt(1)?
Eg, when using Perl Getopt::Long, for long option --title, I can abbreviate
it to -t, as long as the abbreviation is not ambiguous. But I found that I
have to use --t for getopt(1). Any way I can use single dash instead?
This is ambiguous in concept. In traditional UNIX command line syntax
-title would be equivalent to one option - "-t" with a parameter "itle"
or the sequence of options "-t -i -t -l -e". The whole point of the
double dash is so that this ambiguity can be avoided. Whilst you
certainly can create code to parse things the way you want, it isn't
a great idea for this reason and I'd be suprised if you find much s/w
that directly supports it.
--
Andrew Smallshaw
***@sdf.lonestar.org
Loading...