Skip to content

Commit

Permalink
getops: improve getopt-parse.bash example
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Sami Kerola <[email protected]>
  • Loading branch information
kerolasa committed Jul 27, 2016
1 parent 10e8d7a commit d27f5fe
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 32 deletions.
84 changes: 56 additions & 28 deletions misc-utils/getopt-parse.bash
Original file line number Diff line number Diff line change
@@ -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
8 changes: 4 additions & 4 deletions misc-utils/getopt-parse.tcsh
Original file line number Diff line number Diff line change
@@ -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 "
Expand Down

0 comments on commit d27f5fe

Please sign in to comment.