Wie kann ich einen Bash-Variablenwert abrufen, wenn ich den Variablennamen als Zeichenfolge habe?
var1="this is the real value"
a="var1"
Do something to get value of var1 just using variable a.
Kontext:
Ich habe einige AMIs ( Amazon Machine Image ) und möchte einige Instanzen jedes AMI starten. Sobald der Startvorgang abgeschlossen ist, möchte ich jede Instanz entsprechend ihrem AMI-Typ einrichten. Ich möchte nicht viele Skripte oder geheime Schlüssel in einem AMI backen, deshalb habe ich ein verallgemeinertes Startskript vorbereitet und es mit einem öffentlich zugänglichen Link auf S3 gestellt . In rc.local habe ich einen kleinen Code eingefügt, der das Startskript abruft und ausführt. Das ist alles, was ich in den AMIs habe. Anschließend greift jedes AMI auf ein gemeinsames Konfigurationsskript zu, das auf alle AMIs und spezielle Setup-Skripte für jedes AMI anwendbar ist. Diese Skripte sind privat und erfordern eine signierte URL, um darauf zugreifen zu können.
Wenn ich jetzt eine Instanz eines AMI (my_private_ami_1) auslöse, übergebe ich eine signierte URL für eine weitere in S3 präsentierte Datei, die eine signierte URL für alle privaten Skripte in Bezug auf das Schlüssel / Wert-Paar enthält.
config_url="http://s3.amazo.../config?signature"
my_private_ami_1="http://s3.amazo.../ami_1?signature"
...
Wenn das Startskript ausgeführt wird, lädt es die obige Datei herunter und ist source
es. Dann sucht es nach seinem AMI-Typ und wählt das richtige Setup-Skript für sich aus.
ami\_type=GET AMI TYPE #ex: sets ami\_type to my\_private\_ami\_1
setup\_url=GET THE SETUP FILE URL BASED ON AMI\_TYPE # this is where this problem arises
Jetzt kann ich einen generischen Code haben, der Instanzen unabhängig von ihren AMI-Typen auslösen kann, und Instanzen können für sich selbst sorgen.
Bad substitution
Fehler./bin/sh
? Wenn ja, versuchen Sie es/bin/bash
stattdessen. Ab Debian Squeeze/bin/sh
wurde geändert, um ein Symlink fürdash
statt zu seinbash
.dash
unterstützt diese spezielle Syntax nicht und gibt einenBad substitution
Fehler aus.setzt Z auf "foo"
Achten Sie darauf , mit
eval
da diese accidential Ausfürung von Code durch Werte erlauben kann${Y}
. Dies kann durch Code-Injection zu Schäden führen.Beispielsweise
würde schaffen
/tmp/eval-is-evil
. Dies könntenrm -rf /
natürlich auch einige sein .quelle
Meine Suchwörter geändert und verstanden :).
Vielen Dank für Ihre Zeit.quelle
${Y}
. Siehe meinen Zusatz in der Antwort des Benutzers "anon".Für meine Mitbenutzer von zsh besteht der Weg, dasselbe wie die akzeptierte Antwort zu erreichen, darin, Folgendes zu verwenden:
${(P)a}
Dies wird als Ersetzen des Parameternamens bezeichnet
quelle
Moderne Shells unterstützen bereits Arrays (und sogar assoziative Arrays). Verwenden Sie sie also bitte und verwenden Sie weniger Eval.
Wenn Sie es dann aufrufen möchten, geben Sie $ {array [0]} zurück
quelle
$1
)?Basierend auf der Antwort: https://unix.stackexchange.com/a/111627
quelle
Hatte das gleiche Problem mit Arrays. Gehen Sie wie folgt vor, wenn Sie auch Arrays bearbeiten:
Dies wird Folgendes ausgeben:
quelle