Wer Skripte für die Bash auf Linux selbst erstellt, wird früher oder später den Wunsch verspüren, Parameter und Argumente verarbeiten zu können, um die Skripte flexibler zu gestalten.
Ich nutze dazu diese Vorlage:
#!/bin/bash
# /usr/local/bin/.../...
# Handy one-liner that explains what the program does.
function usage()
{
cat << HEREDOC
Handy one-liner that explains what the program does.
Usage: $progname [--parameter1 NUM] [--parameter2 STR] [--parameter3 TIME_STR] [--verbose] [--dry-run]
argument1 [argument2] [argument3] [ ... ]
Example: $progname -d=5 /tmp/folder1/ /tmp/folder2/
explain the example in detail
optional parameter:
-p, --parameter1 NUM explain this parameter
-q, --parameter2 STR explain this parameter
-r, --parameter3 TIME_STR explain this parameter
-h, --help show this help message and exit
-v, --verbose increase verbosity
--dry-run dry run, dont change any files, folders or values
HEREDOC
}
# parse the arguments before getopts, otherwise they will be lost
for i in "$@"; do
if [[ $i = "-"* ]]; then
:
else
arguments+=("$i") # append the arguments to array
fi
done
# initialize default parameter
progname=$(basename $0)
verbose=0
dryrun=0
parameter1=10
parameter2="Hello World!"
parameter3="2023-01-22 17:40:33"
# use getopt and store the output into $OPTS
# note the use of -o for the short options, --long for the long name options
# and a ":" for any option that takes a parameter
OPTS=$(getopt -o "p:q:r:hv" --long "parameter1:,parameter2:,parameter3:,help,verbose,dry-run" -n "$progname" -- "$@")
if [ $? != 0 ] ; then echo "Error in command line arguments. See '$progname -h/--help'." >&2 ; exit 1 ; fi
eval set -- "$OPTS"
while true; do
# echo "\$1:\"$1\" \$2:\"$2\""
case "$1" in
-h | --help ) usage; exit; ;;
-p | --parameter1 ) parameter1="$2"; shift 2 ;;
-q | --parameter2 ) parameter2="$2"; shift 2 ;;
-r | --parameter3 ) parameter3="$2"; shift 2 ;;
--dry-run ) dryrun=1; shift ;;
-v | --verbose ) verbose=$((verbose + 1)); shift ;;
-- ) shift; break ;;
* ) break ;;
esac
done
if (( $verbose > 0 )); then
# print out all the parameters we read in
cat <<EOM
p/parameter1=$parameter1
q/parameter2=$parameter2
r/parameter3=$parameter3
verbose=$verbose
dryrun=$dryrun
arguments=${arguments[@]}
EOM
fi
# Now starts the magic
