Linux-Shell-Skript: Erlaubt dem Benutzer, Variablennamen in der Eingabeaufforderung anzugeben

Linux-Shell-Skript: Erlaubt dem Benutzer, Variablennamen in der Eingabeaufforderung anzugeben

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 -pund 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 evalnur ausgeführt wird, was Sie eingeben. In diesem Fall interpretiert die Shell die Zeichenfolge $inputals $testund führt dann evalaus echo $test. Aber was wäre, wenn der Benutzer $test; rm -rf *? eingibt, evalwü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 testnur 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 evalintegrierte Element übergeben. Beachten Sie, dass evalein 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#_}

verwandte Informationen