problem mit script

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • problem mit script

      Hallo,

      ich habe versucht eine Funktion für mein Script zu schreiben, die aus einer settingsdatei alle Einstellungen ausliest und diese dann in die e2 settingsdatei überträgt.

      Im Prinzip klappt das auch alles, aber es gibt da ein paar Schönheitsfehler die ich nicht lösen konnte. Vielleicht habt Ihr ein paar Tips für mich :)

      Shell-Script

      1. Add_To_Settings(){
      2. # DEST_FILE=/etc/enigma2/settings
      3. # SRC_FILE=$1/set/settings
      4. # test files
      5. DEST_FILE=./dest
      6. SRC_FILE=./src
      7. if [ -e $SRC_FILE ]
      8. then
      9. echo "$SRC_FILE existiert"
      10. else
      11. echo "$SRC_FILE existiert nicht, script kann nicht ausgefuehrt werden"
      12. exit
      13. fi
      14. if [ -e $DEST_FILE ]
      15. then
      16. echo "$DEST_FILE existiert"
      17. else
      18. echo "$DEST_FILE existiert nicht, wir legen es an"
      19. touch $DEST_FILE
      20. fi
      21. echo "Fuege settings aus $SRC_FILE in $DEST_FILE ein"
      22. #IFS ist eine variable fuer den line separator
      23. while IFS="=" read -r name value # die letzte zeile wird nicht verarbeitet
      24. do
      25. if [ "$name" != "" ] #wenn name leer ist, leerzeil einfuegen
      26. then
      27. echo "Pruefe ob $name bereits in $DEST_FILE vorhanden ist"
      28. if [ `grep -c "^$name=" $DEST_FILE` == 0 ] # ist das setting nicht vorhanden, dann
      29. then # einfach anhaengen
      30. echo "$name nicht in $DEST_FILE gefunden, also fuegen wir es mit dem Wert $value hinzu"
      31. echo "$name=$value" >> $DEST_FILE
      32. else # sonst suchen und ersetzen mit sed
      33. echo "$name wurde in $DEST_FILE gefunden, also aktualisieren wir den Wert mit $value"
      34. #bug: ein \ in den variablen verwirrt sed
      35. sed -i "s/^$name=.*/$name=$value/g" $DEST_FILE
      36. fi
      37. fi
      38. done < $SRC_FILE
      39. }
      40. Add_To_Settings
      Alles anzeigen

      Wenn ihr diesen Code als Script abspeichert (z.B. test.sh) und bei das script noch eine Datei mit Settings (z.B. /etc/enigma2/settings) mit dem Dateinamen src legt sollte beim ausführen des scripts eine Datei dest erzeugt werden welche den gleichen Inhalt hat wie src (ohne leerzeilen und Kommentare).

      Sollte es dest schon geben werden die Settings darin aktualisiert, also nicht doppelt eingefügt.

      Meine Probleme:

      Mal abgesehen davon dass der code nicht schon ist, gibt es vor allem zwei Probleme die mich stören:

      1. Die letzte Zeile der src datei wird nicht verarbeitet. Das kann man umgehen, indem man der src Datei als letzte Zeile eine Leerzeile einträgt, aber schön ist das nicht.
      2. Wenn name oder vaule einen / enthalten mag sed das nicht. Das fällt erst auf wenn es die Einträge in dest schon gibt und diese aktualisiert werden. Ich denke man müsste alle / in name und value vor dem sed durch // ersetzen, aber ich habe das nicht hinbekommen...

      Schonmal vorab Danke für Ideen dazu !
    • 1. Das ist streng genommen keine Leerzeile. Unix spezifiziert, dass jede Textzeile durch das Zeilenendzeichen '\n' abgeschlossen werden muss. Das Zeilenabschlusszeichen darf auch am Dateiende nicht fehlen, sonst gibt es Probleme mit Befehlen wie read. Du könntest das Skript aber folgendermassen absichern:

      [[ $(tail -c 1 $SRC_FILE) ]] && echo >> $SRC_FILE

      2. Wähle ein Trennzeichen für sed, das in der Quelldatei nicht vorkommt, z.B.

      sed -i "s|^$name=.*|$name=$value|" $DEST_FILE

      3. Als Kur gegen schmerzhafte `Rückenzecken` empfehle ich

      if grep -q "^$name=" $DEST_FILE; then
      Boycott Any! Please press a neglected key to continue . . .
    • Danke für die Infos, wegen der Feiertag hatte ich bisher keine Zeit dafür.

      zu 1: klappt und habe ich verstanden, danke!

      zu 2: das klappt nicht

      Einträge wie

      Quellcode

      1. config.plugins.epgsearch.history=['l\xd3\xb6wfgrz']
      verlieren noch immer ihre \ so dass der wert falsch ist.

      zu 3: funktioniert gar nicht damit sind angeblich immer alle names schon im dest file.

      trotz rumprobieren habe ich das nicht hinbekommen...
    • 2. Aaargh, '\' sind auch drin? Dann maskieren wir jetzt mal alle Zeichen, die sed nicht mag:

      name="$(echo "$name" | sed 's:[]\[\^\$\.\*\/]:\\&:g')"
      value="$(echo "$value" | sed 's:[]\[\^\$\.\*\/]:\\&:g')"
      sed -i "s/^$name=.*/$name=$value/" $DEST_FILE

      3. Sorry, da fehlt noch ein '!'

      if ! grep -q "^$name=" $DEST_FILE; then
      Boycott Any! Please press a neglected key to continue . . .
    • Shell-Script

      1. Add_To_Settings(){
      2. # DEST_FILE=/etc/enigma2/settings
      3. # SRC_FILE=$1/set/settings
      4. # test files
      5. DEST_FILE=./dest
      6. SRC_FILE=./src
      7. if [ -e $SRC_FILE ]
      8. then
      9. echo "$SRC_FILE existiert"
      10. else
      11. echo "$SRC_FILE existiert nicht, script kann nicht ausgefuehrt werden"
      12. exit
      13. fi
      14. if [ -e $DEST_FILE ]
      15. then
      16. echo "$DEST_FILE existiert"
      17. else
      18. echo "$DEST_FILE existiert nicht, wir legen es an"
      19. touch $DEST_FILE
      20. fi
      21. echo "Fuege settings aus $SRC_FILE in $DEST_FILE ein"
      22. #sicherstellen, dass das file korrekt mit /n abgeschlossen ist
      23. [[ $(tail -c 1 $SRC_FILE) ]] && echo >> $SRC_FILE
      24. #IFS ist eine variable fuer den line separator
      25. while IFS="=" read -r name value # die letzte zeile wird nicht verarbeitet
      26. do
      27. if [ "$name" != "" ] #wenn name leer ist, leerzeil einfuegen
      28. then
      29. echo "Pruefe ob $name bereits in $DEST_FILE vorhanden ist"
      30. if ! grep -q "^$name=" $DEST_FILE; then
      31. echo "$name nicht in $DEST_FILE gefunden, also fuegen wir es mit dem Wert $value hinzu"
      32. echo "$name=$value" >> $DEST_FILE
      33. else # sonst suchen und ersetzen mit sed
      34. echo "$name wurde in $DEST_FILE gefunden, also aktualisieren wir den Wert mit $value"
      35. name="$(echo "$name" | sed 's:[]\[\^\$\.\*\/]:\\&:g')"
      36. value="$(echo "$value" | sed 's:[]\[\^\$\.\*\/]:\\&:g')"
      37. sed -i "s/^$name=.*/$name=$value/" $DEST_FILE
      38. fi
      39. fi
      40. done < $SRC_FILE
      41. }
      Alles anzeigen
      super, es scheint jetzt gut zu klappen, danke !