ubuntuusers.de

[sh] shell script variable aus datei einlesen

Status: Gelöst | Ubuntu-Version: Ubuntu 13.04 (Raring Ringtail)
Antworten |

comp2000

Anmeldungsdatum:
22. Januar 2008

Beiträge: Zähle...

Guten Abend Jetzt hoffe ich auf eure Hilfe, ich habe einen script was 3 werte getrennt durch ein Leerzeichen aus einer Datei einließt (in ein Array ablegt) diese mit anderen Werten vergleicht und bei Veränderung diese wieder in die Datei zurück schreibt.

#!/bin/bash klappt das auch klasse

1
2
3
4
5
#!/bin/bash
myfiles=$(cat ./script.log)
echo $myfiles
array=($myfiles)
echo ${array[3]}

mein script muss aber unter der Standard Shell #!/bin/sh laufen und genau das bekomme ich nicht hin ☹ In der Unix Shell finde ich keine Möglichkeit die Werte in ein Array zu packen und habe auch noch nicht hin bekommen die drei Werte aus der Datei in 3 Variable zu packen. Kann mir jemand weiter helfen wie ich das unter

#!/bin/sh hin bekomme ? leider läuft auf der Box nur die Shell

diesch Team-Icon

Avatar von diesch

Anmeldungsdatum:
18. Februar 2009

Beiträge: 5072

Wohnort: Brandenburg an der Havel

Arrays sind eine Spezialität der Bash, die es in der Bourne Shell nicht gibt.

Nimm sowas wie

1
2
read var1 var2 var3 < ./script.log
echo "$var3"

comp2000

(Themenstarter)

Anmeldungsdatum:
22. Januar 2008

Beiträge: 88

Danke ☺

Genau das hatte ich gebraucht und es funktioniert

einen schönen Abend noch Henry

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13204

comp2000 schrieb:

Genau das hatte ich gebraucht und es funktioniert

Es gibt einen Unterschied!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ cat f1
1
2
3
4
$ cat f2
1       2       3       4
$ unset a
$ a=($(cat f1))
$ echo ${#a[@]}
4
$ echo ${a[@]}
1 2 3 4
$ a=($(cat f2))
$ echo ${#a[@]}
4
$ echo ${a[@]}
1 2 3 4
$ unset x y z
$ read x y z < f1
$ echo $x $y $z
1
$ unset x y z
$ read x y z < f2
$ echo $x $y $z
1 2 3 4

Mit anderen Worten: wenn die Werte nicht in einer Zeile stehen, liefern beide Ansätze unterschiedliche Ergebnisse. Aber:

diesch schrieb:

Arrays sind eine Spezialität der Bash, die es in der Bourne Shell nicht gibt.

Jein. Wenn man eine Funktion für die Verarbeitung verwendet, hat man ein Array:

1
2
3
4
5
$ f(){ echo $1 $2 $3; }
$ f $(cat f1)
1 2 3
$ f $(cat f2)
1 2 3

Übrigens kann man sich den cat in der bash sparen, wenn man die Syntax $(< ...) nimmt:

1
2
3
4
5
$ a=($(< f1))
$ echo ${#a[@]}
4
$ echo ${a[@]}
1 2 3 4

Ciao

robert

Antworten |