"Strich"-Argumente für Shell-Skripte

"Strich"-Argumente für Shell-Skripte

Die meisten Shell-Skripte, die ich verwende, haben eine Syntax wie

./shellscript.sh -first_argument_flag <first_argument_value> -second_argument_flag <second_argument_value>

aber alle Online-Ressourcen für Shell-Skripter diskutieren nur die Übergabe von Positionsargumenten wie

./shellscript.sh <first_argument_value> <second_argument_value> 

die anschließend im Skript als "$1", "$2", usw. verwendet werden.

Ich möchte die erste, benutzerfreundlichere Syntax anstelle der Positionsargument-Syntax verwenden. Nehmen wir als Beispiel an, ich möchte einen Dateinamen mit dem Flag -f und ein Verzeichnis mit dem Flag -d ausgeben. Nennen Sie dieses Skript echofd.sh. Ich möchte

./echofd.sh -f myfile.txt -d /my/directory/ 

um die Ausgabe zu erzeugen

Ihre Datei ist: myfile.txt

Ihr Verzeichnis ist: /mein/Verzeichnis/

und zwar unabhängig davon, in welcher Reihenfolge -f und -d beim Aufruf des Skripts stehen.

Antwort1

Da ist diegetoptsStandard-Dienstprogramm (integriert)in POSIX-Shells zum Parsen von Befehlszeilenargumenten.

Sie können diese Vorlage verwenden:

#! /bin/sh -
PROGNAME=$0

usage() {
  cat << EOF >&2
Usage: $PROGNAME [-v] [-d <dir>] [-f <file>]

-f <file>: ...
 -d <dir>: ...
       -v: ...
EOF
  exit 1
}

dir=default_dir file=default_file verbose_level=0
while getopts d:f:v o; do
  case $o in
    (f) file=$OPTARG;;
    (d) dir=$OPTARG;;
    (v) verbose_level=$((verbose_level + 1));;
    (*) usage
  esac
done
shift "$((OPTIND - 1))"

echo Remaining arguments: "$@"

Dadurch werden die Argumente auf die übliche Weise analysiert, wie es auch bei anderen Standardbefehlen der Fall wäre. Sie können es beispielsweise so aufrufen:

myscript -vvv -f file -d dir other arg
myscript -ffile -ddir -- other arg

Sehendie POSIX-Spezifikationoder Ihr Shell-Handbuch für weitere Einzelheiten.

Antwort2

#!/bin/bash
myfile=''
mydir=''

parse_args() {
    case "$1" in
        -d)
            mydir="$2"
            ;;
        -f)
            myfile="$2"
            ;;
        *)
            echo "Unknown or badly placed parameter '$1'." 1>&2
            exit 1
            ;;
    esac
}

while [[ "$#" -ge 2 ]]; do
    parse_args "$1" "$2"
    shift; shift
done

verwandte Informationen