Ich schreibe ein Shell-Skript für ein Linux-Terminal. Ich möchte Variablennamen in einer Eingabeaufforderung eingeben können. Beispiel:
test.sh:
test="Monkey in the middle..."
read -p "Enter input: " input
echo $input
Ausgabe:
Enter input: $test
$test
Ich möchte in der Lage sein, „$test“ während des Eingabeaufforderungssegments des Skripts einzugeben read -p
und das Skript am Ende „Monkey in the middle...“ als Echo ausgeben zu lassen, anstatt wie jetzt „$test“ auszugeben.
Wie würde ich dabei vorgehen?
AKTUALISIEREN:
Mithilfe der Antworten, die ich hier und indieser Thread(ein großes Dankeschön an die Mitwirkenden und Kommentatoren!), ist es mir gelungen, diese Zeile zusammenzustückeln, die für mich sehr gut funktioniert hat:
newvariable="$(eval echo $input)"
Seien Sie gewarnt: Ich wurde mehr als einmal gewarnt, dass die Verwendung von eval ein Sicherheitsrisiko darstellen kann. Bedenken Sie das, wenn Sie sich für diese Lösung entscheiden.
Antwort1
Anstatt
echo "$input"
versuchen
eval echo "$input"
Es ist nicht einmal Bash-spezifisch, funktioniert auf /bin/sh!
Beachten Sie, dass dies ein ernstes Sicherheitsrisiko darstellt, da eval
nur ausgeführt wird, was Sie eingeben. In diesem Fall interpretiert die Shell die Zeichenfolge $input
als $test
und führt dann eval
aus echo $test
. Aber was wäre, wenn der Benutzer $test; rm -rf *
? eingibt, eval
würde angezeigt werden echo $test; rm -rf *
. Seien Sie sehr vorsichtig, wenn Sie dies tun.
Antwort2
In Bash können Sie einindirekte ParametererweiterungSyntax:
test="Monkey in the middle..."
read -p "Enter input: " input
echo ${!input}
In diesem Fall muss der Benutzer test
nur die Zeichenfolge ohne vorangestelltes Dollarzeichen angeben.
Antwort3
Solange es Ihnen nichts ausmacht, dass der Benutzer beliebige Befehle ausführen kann, indem er eine Befehlsersetzung einfügt $(…)
, können Sie die Zeichenfolge an das eval
integrierte Element übergeben. Beachten Sie, dass eval
ein Shell-Snippet erwartet wird und dass Anführungszeichen, wenn die Eingabe Anführungszeichen enthält, zu Syntaxfehlern führen können. Die (relativ) einfache Möglichkeit, mit Anführungszeichen umzugehen, besteht darin, ein Here-Dokument zum Ausführen der Ersetzungen zu verwenden. Sie sind immer noch einer nicht abgeschlossenen Variablen- oder Befehlsersetzung ausgeliefert (z. B. $(foo
).
IFS= read -r -p "Enter input: " input
eval "string=\$(cat <<EOF
_${input}
EOF
)"
string=${string#_}