Moin Moin,
ich hätte gern mal ein kleines Problem mit bash
Hintergrund ist folgender: Ich installiere Server automatisch, sprich per autoyast und dabei wird ein script als rpm mit installiert das hinterher einige Änderungen vornimmt. Quellen einbinden, Pakete installieren, individuelle Anpassungen halt. Unter Anderem soll es die boot.localfs ändern. Die Zeile tmpfs soll um den Eintrag usbfs erweitert werden. Eigentlich einfach. Oder auch nicht.
Zur Veranschaulichung meiner Probleme hier der Code:
Soweit funktioniert es aber sämtliche Leerzeilen fehlen hinterher.
Ok, nächster Versuch:
Hinsichtlich der Leerzeilen wesentlich besser, die sind nämlich noch da. Aber irgendwie sind Zeilen die ein \ enthalten umgebrochen oder sonst wie verändert. Hier mal ein diff:
Hallo? Was passiert hier? Früher hab ich das Ganze mit einem Perl-script gemacht und nicht mal ansatzweise solche Probleme gekannt? Aber ich will ja nun mit bash arbeiten und daher die Fragen: Warum werden in der ersten Variante die Leerzeilen ignoriert? Warum verändert die zweite Variante den Code?
Und als entscheidende Frage: Wie mache ich das Ganze richtig? Bin ich evtl. durch meine Perl-Vergangenheit auf dem falschen Weg, mit zeilenweise einlesen, testen und die Zeilen wieder ausgeben?
ich hätte gern mal ein kleines Problem mit bash
Zur Veranschaulichung meiner Probleme hier der Code:
Code:
#!/bin/bash
IFS=$'\n'
mv /test/boot.localfs /test/boot.localfs.orig
for g in `cat /test/boot.localfs.orig`
do
if [[ $g =~ 'tmpfs=' ]]
then
aus_b=`echo "$g" | sed 's/mqueue/mqueue,usbfs/'`
echo "$aus_b" >> /test/boot.localfs
else
echo "$g" >> /test/boot.localfs
fi
done
chmod +x /test/boot.localfs
Ok, nächster Versuch:
Code:
#!/bin/bash
mv /test/boot.localfs /test/boot.localfs.orig
while IFS=$'\n' read line
do
if [[ $line =~ 'tmpfs=' ]]
then
aus_b=`echo $line | sed 's/mqueue/mqueue,usbfs/'`
echo "$aus_b" >> /test/boot.localfs
else
echo "$line" >> /test/boot.localfs
fi
done < /test/boot.localfs.orig
chmod +x /test/boot.localfs
Code:
36c36
< typeset -r tmpfs=tmpfs,ramfs,hugetlbfs,mqueue
---
> typeset -r tmpfs=tmpfs,ramfs,hugetlbfs,mqueue,usbfs
69c69
< mount:\ *) continue ;; # messages from mount
---
> mount: *) continue ;; # messages from mount
310c310
< ""|\#*) continue ;;
---
> ""|#*) continue ;;
381,382c381
< cat $mounts | \
< while read des fs type opts rest; do
---
> cat $mounts | while read des fs type opts rest; do
Hallo? Was passiert hier? Früher hab ich das Ganze mit einem Perl-script gemacht und nicht mal ansatzweise solche Probleme gekannt? Aber ich will ja nun mit bash arbeiten und daher die Fragen: Warum werden in der ersten Variante die Leerzeilen ignoriert? Warum verändert die zweite Variante den Code?
Und als entscheidende Frage: Wie mache ich das Ganze richtig? Bin ich evtl. durch meine Perl-Vergangenheit auf dem falschen Weg, mit zeilenweise einlesen, testen und die Zeilen wieder ausgeben?