Variablen deklarieren und definieren in einer for each - Anweisung

oraclin25

Erfahrenes Mitglied
Hallo zusammen,

Code:
#!/bin/bash 
for sqls in SKRIPT1 SKRIPT2 
do 
set TEMP_${sqls}=${sqls} 
done 
echo "test" 
echo "${TEMP_SKRIPT1}"

Ich wollte also mittels for each eine Menge von Variablen definieren. Ich habe getestet, echo "${TEMP_SKRIPT1}" funktioniert nicht:(. Warum? Vielen Dank für die Hilfestellungen.

Schöne Grüße aus Rheinland,

Eure Ratna
 

deepthroat

Erfahrenes Mitglied
Hi.

Siehe "help set". Das Kommando macht etwas ganz anderes.

Siehe "man bash" wie man Variablen setzt und vor allem in welcher Reihenfolge die Expansionen erfolgen. Du müßtest eval verwenden. Siehe "help eval".
 

oraclin25

Erfahrenes Mitglied
Hallo deepthroat,

aahh.. okay, danke.. Stichwort --> eval
Code:
eval EXPORT_${sqls}=$(dirname $0)/${sqls}.sql

eval "löst" in diesem Falle also erst den Kommando auf bevor die Zuweisung ausgeführt wird. Verstehe ich das richtig?

Nun zu der Auflösung von:
Code:
$(dirname $0)

Ich weiss, was $0 und dirname macht. Was machen aber die Klammern nebenan? Also, was macht $(...) ? So einen Befehl hab ich versucht im Google zu finden, leider nicht gefunden. Auf man-pages konnte ich leider auch nichts finden. Könntest Du mir bitte helfen?

Viele Grüße aus Rheinland,

Eure Ratna
 

deepthroat

Erfahrenes Mitglied
aahh.. okay, danke.. Stichwort --> eval
Code:
eval EXPORT_${sqls}=$(dirname $0)/${sqls}.sql

eval "löst" in diesem Falle also erst den Kommando auf bevor die Zuweisung ausgeführt wird. Verstehe ich das richtig?
Ja, es wird erstmal alles evaluiert und das Kommando hinter "eval" expandiert, der resultierende String wird dann (nochmal) ausgeführt.
Nun zu der Auflösung von:
Code:
$(dirname $0)

Ich weiss, was $0 und dirname macht. Was machen aber die Klammern nebenan? Also, was macht $(...) ? So einen Befehl hab ich versucht im Google zu finden, leider nicht gefunden. Auf man-pages konnte ich leider auch nichts finden. Könntest Du mir bitte helfen?
Führe "man bash" aus. Drücke / um die Suche zu starten, dann tippe \ $ \ ( <ENTER>. Dann solltest du schon die richtige Stelle gefunden haben. Falls nicht, tippe solange n bis die richtige Stelle gefunden ist.
 

oraclin25

Erfahrenes Mitglied
Hallo deepthroat,

vielen Dank für die Erklärung, ich verstehe jetzt mehr. Eine komplizierte Zeile, finde ich:

Code:
eval "echo \"$(cat ${FILE_VARIABLE})\" "

Mir geht es um die back-slashes. Ich weiss, dass die Back-slashes gebraucht werden, damit "eval" das Argument nicht als 2 freiliegende Strings interpretiert. In diesem Fall sieht "eval" also \" als freies Literal "
Ich stelle mir vor, als würde das double-quote nicht existieren. Nun, ich frage mich, wieso ist der shell so schlau, dass "echo" die double-quotes immer noch weiterhin als Anführungszeichen interpetrieren kann? Von meiner Logik her müsste, gilt das back-slash ja auch für "echo", oder? Also, nicht nur für "eval".

Vielen Dank.

Schöne Grüße aus Rheinland,

Eure Ratna:)
 

deepthroat

Erfahrenes Mitglied
Die ganze Zeile wird erstmal expandiert (siehe "man bash" für Details über die einzelnen Expansionen).

Danach erst wird die Befehlszeile ausgeführt.

Das Builtin Kommando "eval" erhält demnach als einzelnes Argument:
Code:
echo "$(cat ${FILE_VARIABLE})"
Hierbei fallen die Backslash Zeichen natürlich weg, da sie nur einmal entwerten.