Suche…


Bemerkungen

  • shift verschiebt die Positionsparameter nach links, sodass aus $2 $1 , aus $3 $2 und so weiter.
  • "$@" ist ein Array aller Positionsparameter, die an das Skript / die Funktion übergeben werden.
  • "$*" ist eine Zeichenfolge, die aus allen Positionsparametern besteht, die an das Skript / die Funktion übergeben werden.

Mehrere Parameter analysieren

Um viele Parameter zu analysieren, verwenden Sie hierfür eine while- Schleife, eine Case- Anweisung und eine Shift- Methode.

shift wird verwendet, um den ersten Parameter der Serie aufzurufen, wobei der Wert von $ 2 jetzt $ 1 ist . Dies ist nützlich, um Argumente einzeln zu bearbeiten.

#!/bin/bash

# Load the user defined parameters
while [[ $# > 0 ]]
do
        case "$1" in

                -a|--valueA)
                        valA="$2"
                        shift
                        ;;

                -b|--valueB)
                        valB="$2"
                        shift
                        ;;

                --help|*)
                        echo "Usage:"
                        echo "    --valueA \"value\""
                        echo "    --valueB \"value\""
                        echo "    --help"
                        exit 1
                        ;;
        esac
        shift
done

echo "A: $valA"
echo "B: $valB"

Eingänge und Ausgänge

$ ./multipleParams.sh --help
Usage:
    --valueA "value"
    --valueB "value"
    --help

$ ./multipleParams.sh
A: 
B:

$ ./multipleParams.sh --valueB 2
A: 
B: 2

$ ./multipleParams.sh --valueB 2 --valueA "hello world"
A: hello world
B: 2

Zugriff auf Parameter

Wenn Sie ein Bash-Skript ausführen, werden die an das Skript übergebenen Parameter entsprechend ihrer Position benannt: $1 ist der Name des ersten Parameters, $2 ist der Name des zweiten Parameters und so weiter.

Ein fehlender Parameter wird einfach zu einer leeren Zeichenfolge ausgewertet. Das Vorhandensein eines Parameters kann folgendermaßen überprüft werden:

if [ -z "$1" ]; then
    echo "No argument supplied"
fi

Alle Parameter abrufen

$@ und $* können Sie mit allen Skriptparametern interagieren. In Bezug auf die Bash-Manpage sehen wir Folgendes:

  • $* : Wird bis zu den Positionsparametern erweitert, beginnend mit einem. Wenn die Erweiterung in Anführungszeichen erfolgt, wird sie zu einem einzelnen Wort erweitert, wobei der Wert jedes Parameters durch das erste Zeichen der IFS-Sondervariablen getrennt wird.
  • $@ : Wird bis zu den Positionsparametern erweitert, beginnend mit einem. Wenn die Erweiterung in Anführungszeichen erfolgt, wird jeder Parameter zu einem separaten Wort erweitert.

Anzahl der Parameter abrufen

$# ruft die Anzahl der in ein Skript übergebenen Parameter ab. Ein typischer Anwendungsfall wäre, zu prüfen, ob die entsprechende Anzahl von Argumenten übergeben wird:

if [ $# -eq 0 ]; then
    echo "No arguments supplied"
fi

Beispiel 1

Durchlaufen Sie alle Argumente und prüfen Sie, ob es sich um Dateien handelt:

for item in "$@"
do  
    if [[ -f $item ]]; then
        echo "$item is a file"
    fi  
done

Beispiel 2

Durchlaufen Sie alle Argumente und prüfen Sie, ob es sich um Dateien handelt:

for (( i = 1; i <= $#; ++ i ))
do
    item=${@:$i:1}

    if [[ -f $item ]]; then
        echo "$item is a file"
    fi  
done

Argumentanalyse mit einer for-Schleife

Ein einfaches Beispiel, das die Optionen bietet:

Opt Alt. Opt Einzelheiten
-h --help Zeig Hilfe
-v --version Versionsinfo anzeigen
-dr path --doc-root path Eine Option, die einen sekundären Parameter verwendet (Pfad)
-i --install Eine boolesche Option (true / false)
-* - Ungültige Option
#!/bin/bash
dr=''
install=false

skip=false
for op in "$@";do
    if $skip;then skip=false;continue;fi
    case "$op" in
        -v|--version)
            echo "$ver_info"
            shift
            exit 0
            ;;
        -h|--help)
            echo "$help"
            shift
            exit 0
            ;;
        -dr|--doc-root)
            shift
            if [[ "$1" != "" ]]; then
                dr="${1/%\//}"
                shift
                skip=true
            else
                echo "E: Arg missing for -dr option"
                exit 1
            fi
            ;;
        -i|--install)
            install=true
            shift
            ;;
        -*)
            echo "E: Invalid option: $1"
            shift
            exit 1
            ;;
    esac
done

Wrapper-Skript

Das Wrapper-Skript ist ein Skript, das ein anderes Skript oder einen Befehl einschließt, um zusätzliche Funktionen bereitzustellen oder einfach etwas weniger langweilig zu machen.

Beispielsweise wird das eigentliche egrep im neuen GNU / Linux-System durch ein Wrapper-Skript mit dem Namen egrep . So sieht es aus:

#!/bin/sh
exec grep -E "$@"

Wenn Sie also egrep in solchen Systemen ausführen, führen Sie eigentlich grep -E mit allen weitergeleiteten Argumenten aus.

Wenn Sie ein Beispielskript / Befehl exmp mit einem anderen Skript mexmp exmp möchten, mexmp das Wrapper mexmp Skript im mexmp wie folgt aus:

#!/bin/sh
exmp "$@" # Add other options before "$@"
# or 
#full/path/to/exmp "$@"

String in ein Array in Bash aufteilen

Nehmen wir an, wir haben einen String-Parameter und möchten ihn per Komma teilen

my_param="foo,bar,bash"

Um diese Zeichenfolge durch Kommas zu trennen, können wir verwenden;

IFS=',' read -r -a array <<< "$my_param"

Hier ist IFS eine spezielle Variable namens Internes Feldtrennzeichen, die das Zeichen oder die Zeichen definiert, mit denen ein Muster für einige Operationen in Token unterteilt wird.

Zugriff auf ein einzelnes Element:

echo "${array[0]}"

Um die Elemente zu durchlaufen:

for element in "${array[@]}"
do
    echo "$element"
done

Um sowohl den Index als auch den Wert zu erhalten:

for index in "${!array[@]}"
do
    echo "$index ${array[index]}"
done


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow