getops: improve getopt-parse.bash example

Use correct names of example scripts in the script.  Remove use of
backticks, they require quoting that makes the example harder to follow.
Split one-liners to one-command-at-a-time expressions.  Add continue keyword
to avoid additional case statement matching.  Be strict with quoting.

Reported-by: Benno Schulenberg <bensberg@justemail.net>
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
This commit is contained in:
Sami Kerola 2016-07-27 11:17:47 +01:00
parent 10e8d7a324
commit d27f5fe770
No known key found for this signature in database
GPG Key ID: A9553245FDE9B739
2 changed files with 60 additions and 32 deletions

View File

@ -1,47 +1,75 @@
#!/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
# A small example script for using the getopt(1) program.
# This script will only work with bash(1).
# A similar script using the tcsh(1) language can be found
# as getopt-parse.tcsh.
# Example input and output (from the bash prompt):
# ./parse.bash -a par1 'another arg' --c-long 'wow!*\?' -cmore -b " very long "
#
# ./getopt-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 '
# Option c, argument 'more'
# Option b, argument ' very long '
# Remaining arguments:
# --> `par1'
# --> `another arg'
# --> `wow!*\?'
# --> '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' -- "$@")
# 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 '-long,b-long:,c-long::' -n 'example.bash' -- "$@")
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
if [ $? -ne 0 ]; then
echo 'Terminating...' >&2
exit 1
fi
# Note the quotes around `$TEMP': they are essential!
# Note the quotes around "$TEMP": they are essential!
eval set -- "$TEMP"
unset TEMP
while true ; do
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)
'-a'|'--a-long')
echo 'Option a'
shift
continue
;;
'-b'|'--b-long')
echo "Option b, argument '$2'"
shift 2
continue
;;
'-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 ;;
'')
echo 'Option c, no argument'
;;
*)
echo "Option c, argument '$2'"
;;
esac
shift 2
continue
;;
'--')
shift
break
;;
*)
echo 'Internal error!' >&2
exit 1
;;
esac
done
echo "Remaining arguments:"
for arg do echo '--> '"\`$arg'" ; done
echo 'Remaining arguments:'
for arg; do
echo "--> '$arg'"
done

View File

@ -1,9 +1,9 @@
#!/bin/tcsh
# A small example program for using the new getopt(1) program.
# This program will only work with tcsh(1)
# An similar program using the bash(1) script language can be found
# as parse.bash
# A small example script for using the getopt(1) program.
# This script will only work with tcsh(1).
# A similar script using the bash(1) language can be found
# as getopt-parse.bash.
# Example input and output (from the tcsh prompt):
# ./parse.tcsh -a par1 'another arg' --c-long 'wow\!*\?' -cmore -b " very long "