2008-12-16 8 views
6

ich den Namen einer Variablen aus dem Skript Benutzer als erstes Argument bekommen, und ich echo der Wert der Variablen auf die Konsole zurück:Namen einer Variablen als Eingabe holen und die Variable ändern, um mit diesem Namen

#!/bin/bash 
variablename=$1 
echo "The value of $variablename is: " ${!variablename} 

Das funktioniert super!

Was ich nicht arbeiten kann, ist, wenn ich diese Variable in den Wert des zweiten Arguments vom Benutzer ändern möchte. Ein Beispiel mit einem Syntaxfehler ist:

#!/bin/bash 
variablename=$1 
echo "The value of $variablename is: " ${!variablename} 
echo "I will now try to change the value into $2." 
(!variablename}=$2 
# The above line generates: {!variablename}=2: command not found 

Mit anderen Worten: Wenn es möglich ist, wie bekomme ich eine Variable Namen vom Benutzer und sowohl Lese (bereits gelöst) und Schreiben auf die Variable?

Antwort

7

Ich hatte einen Blitz ganz plötzlich, Minuten nach dem um Hilfe zu bitten, und ich glaube, ich habe eine Lösung:

#!/bin/bash 
variablename=$1 
echo "The value of $variablename is: " ${!variablename} 
echo "I will now try to change the value into $2." 
eval "$variablename=$2" 
echo "Success! $variablename now has the value ${!variablename}!" 

Es funktioniert. Gibt es einen besseren Weg?

+1

Nein, Eval ist der richtige Weg zu gehen. Sie müssen sich jedoch um Leerzeichen in $ 2 sorgen - und einfache Anführungszeichen und doppelte Anführungszeichen und umgekehrte Schrägstriche. –

+0

Danke, dass du mich bestätigt hast, ich bin auf dem richtigen Weg. Ich werde eine Parametervalidierung durchführen, wenn ich etwas von irgendeinem Wiederverwendbarkeitswert erstelle. Im Moment versuche ich hauptsächlich, Bash genauer zu verstehen. :-) –

1

Ihre Lösung funktioniert, aber die Variable hat nur diesen Wert in Ihrem Skript. Es hat keinen Einfluss auf die Variable der "aufrufenden" Anwendung.

Wenn Sie ein Skript oder Programm ausführen, erstellt es eine neue Shell mit einer Kopie der Umgebung. Dies ist von Entwurf, also ändert Ihr Skript keine Dinge wie PATH. Wenn Sie möchten, dass Ihr Skript Umgebungsvariablen für die aufrufende Shell ändern kann, müssen Sie entweder source scriptname oder . scriptname. So funktioniert .bashrc.

+0

Danke für die zusätzlichen Informationen! "Quellskriptname" funktionierte dafür gut. Können Sie etwas über ".scriptname" erzählen, da ich diesen Ansatz nicht verstanden habe? –

+0

Quellskriptname ist im Wesentlichen das Gleiche, aber es ist bash spezifisch mit dem Punkt anstelle der Quelle ist Posix kompatibel –

+0

Die Syntax ist ". Skriptname", nicht ".Scriptename". Der Befehl dot ist gleichbedeutend mit dem Befehl source. – converter42