ubuntuusers.de

Von Win zu Linux

Status: Ungelöst | Ubuntu-Version: Ubuntu 16.10 (Yakkety Yak)
Antworten |

hoge6b01

Anmeldungsdatum:
16. Januar 2008

Beiträge: 105

Hallo zusammen,

ich habe ein simples Batch-Script für Windows. Dieses muss ich aber nun auf die Linux Konsole umschreiben. Könntet ihr mir bitte sagen, ob das so korrekt ist?

Hier die Windows Version:

1
2
3
4
5
6
FOR %%i IN (*.gpx) DO ( 
C:\OSGeo4W64\bin\gpsbabel -i gpx -f %%i -x nuketypes,routes -o gpx -F .\Tracks\%%~ni_trk.gpx
C:\OSGeo4W64\bin\gpsbabel -i gpx -f %%i -x nuketypes,routes -x transform,rte=trk -x simplify,count=250 -o gpx -F  %%~ni_rte1.gpx 
C:\OSGeo4W64\bin\gpsbabel -i gpx -f %%~ni_rte1.gpx -x nuketypes,tracks -o gpx -F .\Routes\%%~ni_rteFIN.gpx 
DEL %%~ni_rte1.gpx
)

Hier meine Linux-Version:

1
2
3
4
5
6
7
#!/bin/bash
FOR f IN (*.gpx) DO ( 
gpsbabel -i gpx -f $f -x nuketypes,routes -o gpx -F /Tracks/$f_trk.gpx
gpsbabel -i gpx -f $f -x nuketypes,routes -x transform,rte=trk -x simplify,count=250 -o gpx -F  $f_rte1.gpx 
gpsbabel -i gpx -f $f_rte1.gpx -x nuketypes,tracks -o gpx -F /Routes/$f_rteFIN.gpx 
rm $f_rte1.gpx
)

Über jegliche Hilfe würde ich mich freuen.

SquirrelOne

Avatar von SquirrelOne

Anmeldungsdatum:
26. Juni 2016

Beiträge: 61

Wohnort: 127.0.0.1

Hallo,

1. Weiß du ob die Optionen von gpsbabel bei Windows und Linux die gleichen sind? Wenn ja, ist der Hauptteil ja richtig ... 2. Eine for Schleife ist in der Bash anders aufgebaut → Auf ubuntuusers wird das auch erklärt.

Mfg Squirrel One

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

hoge6b01 schrieb:

Hier meine Linux-Version:

1
2
3
4
5
6
7
#!/bin/bash
FOR f IN (*.gpx) DO ( 
gpsbabel -i gpx -f $f -x nuketypes,routes -o gpx -F /Tracks/$f_trk.gpx
gpsbabel -i gpx -f $f -x nuketypes,routes -x transform,rte=trk -x simplify,count=250 -o gpx -F  $f_rte1.gpx 
gpsbabel -i gpx -f $f_rte1.gpx -x nuketypes,tracks -o gpx -F /Routes/$f_rteFIN.gpx 
rm $f_rte1.gpx
)

Über jegliche Hilfe würde ich mich freuen.

Fast immer spielt Groß-/Kleinschreibung unter Linux eine Rolle. FOR, IN und DO gibt es nicht, nur for, in und do.

hoge6b01

(Themenstarter)

Anmeldungsdatum:
16. Januar 2008

Beiträge: 105

Danke euch beiden! Und das wäre es dann? Einfach Kleinschreibung? Vielleicht noch irgendwo ein Done? Die Optionen von Gpsbabel sind in Win und Linux gleich.

Hefeweiz3n Team-Icon

Moderator, Webteam
Avatar von Hefeweiz3n

Anmeldungsdatum:
15. Juli 2006

Beiträge: 5815

Wohnort: Ankh-Morpork

Wird alles in Bash-Skripting-Guide für Anfänger → Schleifen erklärt 😉.

In kurz:

for <optionen>
do
    <code in der schleife>
done

Tipp: ; anstatt neuer Zeile geht auch, mann kann also auch

for <optionen>; do; <code in der schleife>; done

schreiben.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

hoge6b01 schrieb:

Danke euch beiden! Und das wäre es dann? Einfach Kleinschreibung? Vielleicht noch irgendwo ein Done? Die Optionen von Gpsbabel sind in Win und Linux gleich.

Die runden Klammern auch weg. Wenn $f Leerzeichen enthalten kann, dann ist auch deren Maskierung nötig:

1
2
3
4
5
gpsbabel -i gpx -f "$f" -x nuketypes,routes -o gpx -F /Tracks/"$f"_trk.gpx
# oder
gpsbabel -i gpx -f "$f" -x nuketypes,routes -o gpx -F "/Tracks/$f_trk.gpx"
# oder
gpsbabel -i gpx -f "$f" -x nuketypes,routes -o gpx -F /Tracks/"$f_trk.gpx"

hoge6b01

(Themenstarter)

Anmeldungsdatum:
16. Januar 2008

Beiträge: 105

Alles klar. Danke. Schaut mal bitte jetzt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

# Variablendefinition
inputdir="/home/foo/gpx"
outputdirTrk="/home/foo/gpx/tracks"
outputdirRte="/home/foo/gpx/routes"

# Abarbeiten der eingelesenen GPX-Files mit Hilfe einer For-Schleife
# und dem Programm GPSBabel.

for f in "$inputdir"/*.gpx ; do 
    gpsbabel -i gpx -f "$f" -x nuketypes,routes -o gpx -F "$outputdirTrk/$f_trk.gpx"

    gpsbabel -i gpx -f "$f" -x nuketypes,routes -x transform,rte=trk -x simplify,count=250 -o gpx -F  "$f_rte1.gpx"
    gpsbabel -i gpx -f "$f_rte1.gpx" -x nuketypes,tracks -o gpx -F "$outputdirRte/$f_rteFIN.gpx"

    rm "$inputdir/$f_rte1.gpx"

done

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

hoge6b01 schrieb:

Alles klar. Danke. Schaut mal bitte jetzt:

Wenn das kein Tutorial werden soll, für Anfänger in Shellprogrammierung, dann sind die Kommentare schlecht.

Jeder sieht, dass da eine Variablendeklaration ist, das schreibt man nicht hin. Eher minimiert man die Wiederholung:

1
2
3
4
5
#!/bin/bash

inputdir="/home/foo/gpx"
outputdirTrk="$inputdir/tracks"
outputdirRte="$inputdir/routes"

Jeder, der schon ein wenig gescriptet hat, erkennt, dass da eine For-Schleife ist, außer denen, denen der Kommentar auch nicht weiterhilft.

Das Programm gpsbabel sticht auch heraus.

Du könntest als Kommentar hinterlassen, wieso Du diese Parameter gewählt hast, aber da mir das Programm und sein Zweck völlig unbekannt sind weiß ich nicht, ob das nicht jedem, der das Script ändern könnte, offensichtlich ist.

1
2
3
4
5
6
for f in "$inputdir"/*.gpx ; do 
    gpsbabel -i gpx -f "$f" -x nuketypes,routes -o gpx -F "$outputdirTrk/$f_trk.gpx"
    gpsbabel -i gpx -f "$f" -x nuketypes,routes -x transform,rte=trk -x simplify,count=250 -o gpx -F  "$f_rte1.gpx"
    gpsbabel -i gpx -f "$f_rte1.gpx" -x nuketypes,tracks -o gpx -F "$outputdirRte/$f_rteFIN.gpx"
    rm "$inputdir/$f_rte1.gpx"
done

Ungewöhnliche Dinge, Sachen, die man leicht falsch macht, die man zu vergessen droht, später noch mal brauchen kann, das kommentiert man. Mit 12 statt 19 Zeilen passt mehr Information auf den Bildschirm.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4695

Wohnort: Berlin

Ich finde die *rte1.gpx-Datei im Verzeichnis mit den Eingabedateien ungünstig. Wenn das mal abbricht, dann liegt die da immer noch und wird bei einem erneuten Lauf als normale Eingabedatei behandelt.

1
2
3
4
5
6
7
for f in "$inputdir"/*.gpx ; do 
    gpsbabel -i gpx -f "$f" -x nuketypes,routes -o gpx -F "$outputdirTrk/$f_trk.gpx"
    rte1_name=$(mktemp --suffix .gpx)
    gpsbabel -i gpx -f "$f" -x nuketypes,routes -x transform,rte=trk -x simplify,count=250 -o gpx -F  "$rte1_name"
    gpsbabel -i gpx -f "$rte1_name" -x nuketypes,tracks -o gpx -F "$outputdirRte/$f_rteFIN.gpx"
    rm "$rte1_name"
done
Antworten |