Freitag, 25. Mai 2012, 15:37

Du bist nicht angemeldet.



Hutchef

hat hier 2. Wohnsitz.

  • »Hutchef« ist der Autor dieses Themas

Beiträge: 252

Ubuntu: 11.04

Kernel: aus der Paketverwaltung

Architektur: 64-bit

  • Private Nachricht senden

1

Mittwoch, 19. Mai 2010, 21:10

Backslash Problem bei Bash-Skript

Hi,

folgendes "simples" Problem beschäftigt mich nun seit geraumer Zeit - klingt simpel, aber irgendwie klemmt es.

Als Benutzereingabe sollen Windowspfade getätigt werden, zum Bsp "C:\Programme\7-Zip\Uninstall.exe"
Das ganze soll in einem Skript umgewandelt werden in:

Quellcode

1
C:/Programme/7-Zip/Uninstall.exe
und in einer Datei verstaut werden.

Das ganze sieht derzeit so aus:

Quellcode

1
2
3
4
read -p "Eingabe: " SILENT
echo $SILENT
SILENT=$(echo $SILENT | sed "s/[\]/\//g;")
echo $SILENT > /home/hutchef/datei.txt


Als Ausgabe bekomme ich

Quellcode

1
C:Programme7-ZipUninstall.exe

... auch verständlich. Nun die Frage:
Wie bekomme ich es hin, das die Backslashs nicht als Entwerter gezählt werden und einfach verschluckt? Ich kann den Benutzer nicht zwingen, da doppel-Backslash zu machen.


Weiteres Problem habe ich bei der Eingabe mit Doppelbackslash (C:\\Programme\\7-Zip\\Uninstall.exe)
Als Ausgabe auf der Shell bekomme ich

Quellcode

1
C:\Programme-Zip\Uninstall.exe
und in der Datei steht

Quellcode

1
C:/Programme-Zip/Uninstall.exe
(so'n unlustiges Kästchen -__-

Hinweise, Infos, Literatur etc gerne genommen :S
mfg Hutchef

Es ist besser für das, was man ist, gehasst,
als für das, was man nicht ist, geliebt zu werden.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Hutchef« (19. Mai 2010, 23:56)


Jean-Paul

ist zu Gast bei Freunden.

Beiträge: 14

Ubuntu: ---

Desktop: ---

Architektur: ---

  • Private Nachricht senden

2

Mittwoch, 19. Mai 2010, 22:21

Keine Ahnung was bei dir nicht geht. dein Script funktioniert jedenfalls.
Habs mal so getestet:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
#!/bin/sh

SILENT="C:\\Hallo\\7-Zip\\Windows.exe"
SILENT=$(echo $SILENT | sed "s/[\]/\//g;")
echo $SILENT
echo $SILENT > test.txt

SILENT1="C:\das\ist\ein\weiterer\test\fuer\Windows.exe"
SILENT1=$(echo $SILENT1 | sed "s/[\]/\//g;")
echo $SILENT1
echo $SILENT1 >> test.txt

Und in der Datei steht dann:

Quellcode

1
2
3
[jean ~]$ cat test.txt 
C:/Hallo/7-Zip/Windows.exe
C:/das/ist/ein/weiterer/test/fuer/Windows.exe


Ich tippe da auf ein Locale-Problem oder auf den Zeichensatz.

Jean-Paul
Crux

Hutchef

hat hier 2. Wohnsitz.

  • »Hutchef« ist der Autor dieses Themas

Beiträge: 252

Ubuntu: 11.04

Kernel: aus der Paketverwaltung

Architektur: 64-bit

  • Private Nachricht senden

3

Mittwoch, 19. Mai 2010, 23:06

Hm...

ich habe mal CopY&Paste gemacht mit deinen Beispielen... selbe Grütze.

Quellcode

1
2
3
....sh test.sh 
C:/Hallo-Zip/Windows.exe
....


Muss ich wohl an einer anderen Stelle suchen. Danke

Update:
Auf 4 verschiedenen Maschinen getestet: 10.04 Server und Desktop, 9.10 Server
Entweder ich installiere falsch oder ka...
Habe entweder die Server Edition oder die Alternate drauf, 64Bit (Server, Alternate) und 32Bit (Server)...

dpkg-reconfigure -locales brachte auch nichts

Quellcode

1
2
echo $LANG
de_DE.utf8


Habe es mit nano, vim und gedit getestet.
Öffne ich die txt datei, steht dort "^G" drin statt der 7 und dem Backslash

X(
mfg Hutchef

Es ist besser für das, was man ist, gehasst,
als für das, was man nicht ist, geliebt zu werden.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Hutchef« (19. Mai 2010, 23:35)


basslord

Ubuntufreund

Beiträge: 2 671

Ubuntu: 12.04

Kernel: 3.2.0-24-generic

Desktop: KDE

Architektur: 64-bit

Danksagungen: 1 / 1

  • Private Nachricht senden

4

Mittwoch, 19. Mai 2010, 23:28

Hi,

also ich tippe auf bash != dash ;) Versuche es mal hiermit:

Quellcode

1
2
3
4
5
6
#!/bin/bash

read -r -p "Eingabe: " SILENT
echo $SILENT
SILENT=$(echo "$SILENT" | sed 's/[\]/\//g')
echo $SILENT > datei


Gruß
Rodge
"Ohne Musik wäre das Leben ein Irrtum." - Friedrich Nietzsche

Hutchef

hat hier 2. Wohnsitz.

  • »Hutchef« ist der Autor dieses Themas

Beiträge: 252

Ubuntu: 11.04

Kernel: aus der Paketverwaltung

Architektur: 64-bit

  • Private Nachricht senden

5

Mittwoch, 19. Mai 2010, 23:39

Update gerade getippt ^^

auch mit Copy&Paste gearbeitet
Ergebnis nicht anderes:
-> keine 7 und kein Backlsash
in der Datei steht

Quellcode

1
C:/Programme^G-Zip/Uninstall.exe
drin
mfg Hutchef

Es ist besser für das, was man ist, gehasst,
als für das, was man nicht ist, geliebt zu werden.

basslord

Ubuntufreund

Beiträge: 2 671

Ubuntu: 12.04

Kernel: 3.2.0-24-generic

Desktop: KDE

Architektur: 64-bit

Danksagungen: 1 / 1

  • Private Nachricht senden

6

Mittwoch, 19. Mai 2010, 23:50

Hm, schon merkwürdig... Leider versagt gleich mein Akku, aber ich schaue morgen noch mal rein. Das ^G bekomme ich auch, wenn es unter der dash läuft, aber mit dem Shebang ist ja klar, dass die bash genutzt wird. Hm, wie rufst du das skript auf? Doch nicht so:

Quellcode

1
sh script.sh

Try this:

Quellcode

1
./script.sh

oder so

Quellcode

1
bash script.sh


Gruß und gute Nacht,
Rodge
"Ohne Musik wäre das Leben ein Irrtum." - Friedrich Nietzsche

Hutchef

hat hier 2. Wohnsitz.

  • »Hutchef« ist der Autor dieses Themas

Beiträge: 252

Ubuntu: 11.04

Kernel: aus der Paketverwaltung

Architektur: 64-bit

  • Private Nachricht senden

7

Mittwoch, 19. Mai 2010, 23:55

Ich kotze gleich (sorry)

Quellcode

1
bash script.sh

und alles ist wie es sein soll - knapp vier Stunden und dann dieser Schusselffehler
hatte bisher immer einfach

Quellcode

1
sh script.sh

benutzt - zum ersten mal seit ich mich mit Skripten beschäftige, liefert das nen Fehler
Da weiß ich was ich morgen lesen werde

Vielen Dank Rodge

*sichschämengeh*
mfg Hutchef

Es ist besser für das, was man ist, gehasst,
als für das, was man nicht ist, geliebt zu werden.

haliner

hat hier 2. Wohnsitz.

Beiträge: 423

Ubuntu: ---

Kernel: 2.6.39-ARCH

Desktop: KDE

Architektur: ---

  • Private Nachricht senden

8

Donnerstag, 20. Mai 2010, 14:22

Warum überhaupt so kompliziert?
Du liest von stdin, schreibst es in eine Variable, fütterst sed mit dieser Variable und schreibst die Ausgabe wiederum in eine Datei.

Geht es nicht viel einfacher mit folgender Zeile?

Quellcode

1
sed -e 's|\\|/|g' > datei

Falls du Eingabe auf eine Zeile begrenzen willst, würde ich es so machen:

Quellcode

1
head -n 1 | sed -e 's|\\|/|g' > datei


Vorteil: Keine Einsatz irgendwelcher Bashisms und der Code spricht für sich ;)

Gruß,
Stefan

Hutchef

hat hier 2. Wohnsitz.

  • »Hutchef« ist der Autor dieses Themas

Beiträge: 252

Ubuntu: 11.04

Kernel: aus der Paketverwaltung

Architektur: 64-bit

  • Private Nachricht senden

9

Donnerstag, 20. Mai 2010, 14:54

Hi,

ich arbeite mit der Variable dann noch weiter. Es werden weitere Variablen vom User gefüllt und dann zusammen in eine Datei als Zeile geschrieben, die ich später bei Bedarf mit awk wieder auslese.

Da ich mich erst seit kurzer Zeit mit tief gehender Skriptung befasse, bin ich froh das ich soweit alles selber hinbekomme, mir anlese etc. Später vielleicht kann ich meine Zeilen auch so schlank gestalten und verstehe was ich da getan habe ^_-
mfg Hutchef

Es ist besser für das, was man ist, gehasst,
als für das, was man nicht ist, geliebt zu werden.

haliner

hat hier 2. Wohnsitz.

Beiträge: 423

Ubuntu: ---

Kernel: 2.6.39-ARCH

Desktop: KDE

Architektur: ---

  • Private Nachricht senden

10

Donnerstag, 20. Mai 2010, 15:03

Dann ist es natürlich etwas anderes. War wie gesagt nur ein Vorschlag, damit du den etwas komplizierteren Weg nicht umsonst gehst :)

Etwas kannst du meinem Beitrag vielleicht dennoch entnehmen: Du kannst das Feldtrenner-Zeichen beim sed-s-Befehl selbst wählen. Wenn im regulären Ausdruck also „/“ enthalten sind, dann kannst du auch „|“ als Feldtrenner nutzen und sparst dir das lästige escapen dieser.

Viel Spaß noch mit den Shellscripts ;),
Stefan