Forum: PC-Programmierung array in /bin/sh script


von dEx (Gast)


Lesenswert?

ich will umgebungsvariablen eines scripts in einer textdatei abspeichern 
und bei erneutem ausführen damit arbeiten können.

mein kleines testscript für die bash sah so aus
1
#!/bin/bash
2
3
n=0
4
j=0
5
6
#funktionen
7
save_var_in_file() {
8
  var=$1
9
  echo $var >> variablen
10
return
11
}
12
13
#auslesen der datei
14
while read zeilen_inhalt ; do    
15
  zeilen[$n]="$zeilen_inhalt"
16
  n=`expr $n + 1`
17
done < variablen
18
19
20
#die variablen werden im script bearbeitet
21
zeilen[1]=1
22
zeilen[4]=1
23
24
#die bearbeiteten werte in datei schreiben
25
rm variablen
26
while [ $j -le $n ] 
27
do
28
  save_var_in_file ${zeilen[j]}
29
  j=`expr $j + 1`
30
done

ich lese also zu beginn meine textdatei ein, ändere die variablen im 
script und schreibe sie am ende in die datei. wenn ich meine testdatei 
vorher mit 8 nullen gefüllt habe waren die nullen in zeile 1 und 4 auch 
nacher brav einsen.


jetzt zum problem. das ganze soll nicht in einer bash sondern unter 
/bin/sh laufen. der selbe code hat dort aber probleme mit den arrays

./script.sh: zeilen[1]=1t: not found

wie löse ich das am besten?

von Klaus W. (mfgkw)


Lesenswert?

Hatte die sh überhaupt Felder?
Und warum nicht in der bash? Wenn es etwas altes sein soll,
dann gibt es noch die ksh - die kennt Felder, wenn ich mich
nicht irre und ist eine Weiterentwickklung der sh.

von Klaus W. (mfgkw)


Lesenswert?

... und ein Vorläufer der bash übrigens.

von dEx (Gast)


Lesenswert?

es soll ein script für ein android handy werden. dort steht nur /bin/sh 
zur verfügung. ich glaube auch das es dort keine arrays gibt, aber 
irgendeine lösung muss es doch geben

von Klaus W. (mfgkw)


Lesenswert?

Natürlich.
Du brauchst doch gar nicht die ganze Datei im Speicher halten.
Es geht ohne Felder, wenn du zeilenweise liest, deine Änderungen
oder die Originalzeilen in eine andere Datei speicherst und
zum Schluß das Original wegwirfst und durch die Kopie ersetzst.

Ohne eigenes Programmieren geht es auch mit awk oder sed,
falls das auf deinem Superrechner installiert ist.

von dEx (Gast)


Lesenswert?

daran hatte ich auch schon gedacht. aber ich weiß nicht wie ich einzelne 
zeilen nach der ersten auslesen kann. also zB die 5. zeile

von Klaus W. (mfgkw)


Lesenswert?

Einfach in einer Schleife lesen.
Beim ersten Durchlauf bekommst du die erste Zeile, beim zweiten die 
zweite...

von dEx (Gast)


Lesenswert?

schäm ...

von Klaus W. (mfgkw)


Lesenswert?

so etwa:
1
#!/bin/sh
2
3
zeilennummer=1
4
rm -f tmp.txt
5
6
while read zeile
7
do
8
9
    if [ $zeilennummer -eq 1 -o $zeilennummer -eq 4 ]
10
    then
11
        echo 1 >> tmp.txt
12
    else
13
        echo $zeile >> tmp.txt
14
    fi
15
    zeilennummer=`expr $zeilennummer + 1`
16
17
done <test.txt
18
19
mv -f tmp.txt test.txt

von Klaus W. (mfgkw)


Lesenswert?

achso: damit der Dateiname der temporären Datei nicht kollidiert,
wenn das Skript mehrfach läuft, kann man $$ in den Dateinamen
einbauen; das wird durch die aktuelle pid ersetzt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.