From d27f5fe770025e456fbd33b87a96968f34c455ed Mon Sep 17 00:00:00 2001 From: Sami Kerola Date: Wed, 27 Jul 2016 11:17:47 +0100 Subject: 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 Signed-off-by: Sami Kerola --- misc-utils/getopt-parse.bash | 84 +++++++++++++++++++++++++++++--------------- misc-utils/getopt-parse.tcsh | 8 ++--- 2 files changed, 60 insertions(+), 32 deletions(-) (limited to 'misc-utils') diff --git a/misc-utils/getopt-parse.bash b/misc-utils/getopt-parse.bash index aab8c6238..348c445a4 100644 --- a/misc-utils/getopt-parse.bash +++ b/misc-utils/getopt-parse.bash @@ -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 diff --git a/misc-utils/getopt-parse.tcsh b/misc-utils/getopt-parse.tcsh index 408c4706b..032d7ac08 100644 --- a/misc-utils/getopt-parse.tcsh +++ b/misc-utils/getopt-parse.tcsh @@ -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 " -- cgit v1.2.3-55-g7522