Bash Script Vorlage mit Parameter-Verarbeitung

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