www.mikrocontroller.net

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


Autor: dEx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
#!/bin/bash

n=0
j=0

#funktionen
save_var_in_file() {
  var=$1
  echo $var >> variablen
return
}

#auslesen der datei
while read zeilen_inhalt ; do    
  zeilen[$n]="$zeilen_inhalt"
  n=`expr $n + 1`
done < variablen


#die variablen werden im script bearbeitet
zeilen[1]=1
zeilen[4]=1

#die bearbeiteten werte in datei schreiben
rm variablen
while [ $j -le $n ] 
do
  save_var_in_file ${zeilen[j]}
  j=`expr $j + 1`
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?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... und ein Vorläufer der bash übrigens.

Autor: dEx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: dEx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: dEx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schäm ...

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so etwa:
#!/bin/sh

zeilennummer=1
rm -f tmp.txt

while read zeile
do

    if [ $zeilennummer -eq 1 -o $zeilennummer -eq 4 ]
    then
        echo 1 >> tmp.txt
    else
        echo $zeile >> tmp.txt
    fi
    zeilennummer=`expr $zeilennummer + 1`

done <test.txt

mv -f tmp.txt test.txt

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.