Bash-Funktion weist dem übergebenen Parameter einen Wert zu

Bash-Funktion weist dem übergebenen Parameter einen Wert zu

Ich habe folgende Situation:

Ich schreibe ein Skript, das seine Parameter entweder aus einer Konfigurationsdatei liest (sofern vorhanden und Parameter vorhanden) oder den Benutzer auffordert, den besagten Parameter einzugeben, wenn er nicht vorhanden ist.

Da ich dies für eine Handvoll Parameter mache, dachte ich, das Schreiben einer Funktion wäre die Lösung.

Soweit ich es verstehe, gibt die Funktion den Ergebniswert jedoch zurück, indem sie echoihn verarbeitet oder einer globalen Variable zuweist. Ich möchte jedoch in der Funktion eine Ausgabe auf dem Bildschirm anzeigen, daher muss ich Option zwei verwenden. Also habe ich Folgendes versucht:

# parameters: $1=name of parameter, $2=user prompt, $3=value read from config.cfg
function getParameter {
    # If the value couldn't be read from the config file
    if [ -z "$3" ]; then
        # Echo the prompt
        echo "$2"
        # Read the user input
        read parameter

        # If it's empty, fail
        if [ -z "$parameter" ]; then
            echo "Parameter $1 not found"
            exit
        # Else, try to assign it to $3   <---- This is where it fails
        else
            $3="$parameter"
        fi
    fi
}

Ich nenne es so:

getParameter "Database username" "Please enter database username" $database_username

Die config.cfgDatei wird sourcevor dem Aufruf der Funktion geladen und $database_usernameist dort einer der optionalen Parameter.

Das funktioniert nun offensichtlich nicht. Ich kann nichts zuweisen $3und da ich möchte, dass die Methode generisch ist, kann ich MY_VARIABLE=$parameterbeides nicht tun.

Hat jemand Vorschläge, wie ich das Folgende erreichen kann:

  1. Holen Sie sich den Variablenwert entweder von config.cfgoder lesen Sie ihn aus der Benutzereingabe
  2. Gehen Sie dabei generisch vor, d. h. wiederholen Sie den obigen Code (ohne Funktion) nicht für jeden Parameter.

Antwort1

Ich bin nicht 100 % sicher, ob ich das verstehe, aber nehmen wir an, eine configDatei sieht folgendermaßen aus:

foo
database_user tom
bar

Der offensichtliche Wert, den wir wollen, ist der von database_user.

In ein Skript könnten Sie einfach eine Zeile wie diese einfügen:

dbUser=$(sed -nE 's/database_user (.*$)/\1/p' config)

$dbUserDann enthält die Variable diese Informationen:

echo $dbUser 
tom

Antwort2

Okay, sieht so aus, als hätte ich mein eigenes Problem gelöst:

function getParameter {
    if [ -z "$3" ]; then
        # User read -p to show a prompt rather than using echo for this
        read -p "$2`echo $'\n> '`" parameter

        # Print to sdterr and return 1 to indicate failure
        if [ -z "$parameter" ]; then
            >&2 echo "Parameter $1 not found"
            return 1
        else
            echo $parameter
        fi
    else
        echo $3
    fi
}

Durch die Verwendung von echo -pkonnte ich eine Eingabeaufforderung auf der Konsole anzeigen und trotzdem einen String aus der Funktion zurückgeben, indem ich regular verwendete echo. Auf diese Weise database_username=$(getParameter ...)kann ich die Funktion durch Aufrufen mit einer Variablen zuweisen.

verwandte Informationen