
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 echo
ihn 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.cfg
Datei wird source
vor dem Aufruf der Funktion geladen und $database_username
ist dort einer der optionalen Parameter.
Das funktioniert nun offensichtlich nicht. Ich kann nichts zuweisen $3
und da ich möchte, dass die Methode generisch ist, kann ich MY_VARIABLE=$parameter
beides nicht tun.
Hat jemand Vorschläge, wie ich das Folgende erreichen kann:
- Holen Sie sich den Variablenwert entweder von
config.cfg
oder lesen Sie ihn aus der Benutzereingabe - 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 config
Datei 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)
$dbUser
Dann 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 -p
konnte 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.