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:
parent
10e8d7a324
commit
d27f5fe770
|
@ -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
|
||||
|
|
|
@ -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 "
|
||||
|
|
Loading…
Reference in New Issue