summaryrefslogtreecommitdiffstats
path: root/misc-utils/getopt-parse.bash
diff options
context:
space:
mode:
Diffstat (limited to 'misc-utils/getopt-parse.bash')
-rw-r--r--misc-utils/getopt-parse.bash75
1 files changed, 75 insertions, 0 deletions
diff --git a/misc-utils/getopt-parse.bash b/misc-utils/getopt-parse.bash
new file mode 100644
index 0000000..db8bf6b
--- /dev/null
+++ b/misc-utils/getopt-parse.bash
@@ -0,0 +1,75 @@
+#!/bin/bash
+
+# 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):
+#
+# ./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 '
+# 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 [ $? -ne 0 ]; then
+ echo 'Terminating...' >&2
+ exit 1
+fi
+
+# Note the quotes around "$TEMP": they are essential!
+eval set -- "$TEMP"
+unset TEMP
+
+while true; do
+ case "$1" in
+ '-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'
+ ;;
+ *)
+ 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