CAVEAT
The solution below does not check for incomplete / malformed command invocation! For example, if--p_outrequires an argument, but the command is called asmy-script.sh --p_out --arg_1 27then it will happily assign the string"--arg_1"to thep_outvariable.
This answer was initially an edit of @cdmo's answer (thanks to @Milkncookiez's comment also!), that got rejected as expected.
When using the variables, one can make sure that they have a default value set by using "${p_out:-"default value"}" for example.
From 3.5.3 Shell Parameter Expansion of the GNU Bash manual:
${parameter:-word}
If parameter is unset or null, the expansion of word is substituted. Otherwise, the value of parameter is substituted.
#!/usr/bin/env bash while [ $# -gt 0 ]; do case "$1" in -p|-p_out|--p_out) p_out="$2" ;; -a|-arg_1|--arg_1) arg_1="$2" ;; *) printf "***************************\n" printf "* Error: Invalid argument.*\n" printf "***************************\n" exit 1 esac shift shift done # Example of using the saved command line arguments. # WARNING: Any of these may be an empty string, if the corresponding # option was not supplied on the command line! echo "Without default values:" echo "p_out: ${p_out}" echo "arg_1: ${arg_1}"; echo # Example of using parsed command line arguments with DEFAULT VALUES. # (E.g., to avoid later commands being blown up by "empty" variables.) echo "With default values:" echo "p_out: ${p_out:-\"27\"}" echo "arg_1: ${arg_1:-\"smarties cereal\"}" If the above script is saved into my-script.sh, then these invocations are all equivalent:
$ . my-script.sh -a "lofa" -p "miez" $ . my-script.sh -arg_1 "lofa" --p_out "miez" $ . my-script.sh --arg_1 "lofa" -p "miez" (where . is Bash's source command.)
To demonstrate the default values part, here's the output without any arguments given:
$ . my-script.sh Without default values: p_out: arg_1: With default values: p_out: "27" arg_1: "smarties cereal"