# Variablen deklarieren und definieren in einer for each - Anweisung



## oraclin25 (24. April 2013)

Hallo zusammen,


```
#!/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 (24. April 2013)

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 (24. April 2013)

Hallo deepthroat,

aahh.. okay, danke.. Stichwort --> eval  

```
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:

```
$(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 (24. April 2013)

oraclin25 hat gesagt.:


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


Ja, es wird erstmal alles evaluiert und das Kommando hinter "eval" expandiert, der resultierende String wird dann (nochmal) ausgeführt.


oraclin25 hat gesagt.:


> Nun zu der Auflösung von:
> 
> ```
> $(dirname $0)
> ...


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 (25. April 2013)

Hallo deepthroat,

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


```
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 (26. April 2013)

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:

```
echo "$(cat ${FILE_VARIABLE})"
```
Hierbei fallen die Backslash Zeichen natürlich weg, da sie nur einmal entwerten.


----------

