Shift: Gibt es eine globale Version?

Shift: Gibt es eine globale Version?

Um die Argumentliste zu analysieren, habe ich versucht, ein allgemeines Top-Down-Analyseschema zu implementieren.

Ich habe mich gewundert, warum meine eat()Funktion nicht funktioniert. Weil die Positionsargumente $1, $2, $3, ... im Kontext dieser bestimmten Funktion stehen. Nicht die des eigentlichen Skripts. Schade. Ich habe mich noch nicht an Bash gewöhnt.

Meine Frage ist also, ob es deshalb richtig ist, dass auch der Umfang der Verschiebung den Kontext meiner eat()Funktion darstellt, ja?

Gibt es wirklich keine Möglichkeit, die Skriptargumente innerhalb einer anderen Funktion zu verschieben? : (

[Das bedeutet, dass ich die GESAMTE Logik (die normalerweise einem Top-Down-Parser entspricht) in einer Case-Anweisung implementieren muss! (!?)]

Antwort1

Eine Funktion kann alle (oder eine Teilmenge) der Argumente zurückgeben, die ihr übergeben wurden (z. B. über ein globales Array), und das aufrufende Skript kann diese dann verwenden, um seine eigenen Argumente festzulegen. Beispiel:

#!/bin/bash

declare -a args

nofoo() {
  # we don't like "--foo", it is forbidden!
  for a in "$@"; do
    [ "$a" != "--foo" ] && args+=("$a")
  done
}

nofoo "$@"
set -- "${args[@]}"

Aus help setBash:

Satz:set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]

Werte von Shell-Optionen und Positionsparametern festlegen oder aufheben.

Ändern Sie den Wert von Shell-Attributen und Positionsparametern oder zeigen Sie die Namen und Werte von Shell-Variablen an.

[...]

-- Weisen Sie den Positionsparametern alle verbleibenden Argumente zu. Wenn keine Argumente übrig sind, werden die Positionsparameter aufgehoben.

verwandte Informationen