[gelöst] bash-einzeiler

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
manes
Beiträge: 958
Registriert: 27.08.2007 11:26:54
Wohnort: Köln
Kontaktdaten:

[gelöst] bash-einzeiler

Beitrag von manes » 11.02.2013 22:49:31

hallo forum,

ich tue mich wieder einmal schwer mit einem einzeiler auf der bash. kann mir jemand bitte einen tip geben, woran es diesmal hakt?
ich habe eine große zahl von mkv-containern und gleichnamigen separaten srt-untertitelfiles.
mit mkvmerge kann man die srt-files in den container einfügen:

Code: Alles auswählen

mkvmerge -o(utputfile) movie-mit-subtitle.mkv movie-ohne-subtitle.mkv movie.srt
ich rufe also ein .mkv-file auf und möchte der bash mitteilen, daß sie das dazugehörige .srt-file nehmen soll:

Code: Alles auswählen

#!/bin/bash
ZIEL=/pfad/zum/zielverzeichnis
SRT=$( $(echo `basename $i .mkv`).srt)
#SRT=$(basename $i .mkv).srt
#SRT=$(echo $i | sed 's/.mkv$/.srt/')
for i in *.mkv; do
mkvmerge -v -o $ZIEL/$i $i $SRT;
done
mit dieser variable $SRT komme ich nicht zurecht. ein paar von unzähligen versuchen hab ich auskommentiert stehen lassen. entweder wird die untertiteldatei ignoriert oder ich bekomme fehler à la
Fehler: Die Datei '.mkv.srt' konnte nicht zum Lesen geöffnet werden: open file error
wo liegt denn mein "denk"fehler?
debian wheezy, aktuelles mkvtoolnix [mkvmerge v6.0.0 ('Coming Up For Air')] von bunkus.org
grüße
manes
Zuletzt geändert von manes am 14.02.2013 18:53:53, insgesamt 1-mal geändert.
Sometimes you have a programming problem and it seems like the best solution is to use regular expressions; now you have two problems.
David Mertz

syssi
Beiträge: 2951
Registriert: 24.12.2010 16:50:59
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rheinland

Re: bash-einzeiler, stehe auf dem schlauch

Beitrag von syssi » 11.02.2013 23:01:05

Deine Variable "$i" ist nicht belegt. Ich glaube du meinst vielmehr soetwas, wie "$1". Ausserdem scheint dir nicht klar zu sein, dass diese Anfuehrungszeichen DATE=`date` das Gleiche sind, wie DATE=$(date). Letzteres ist die neue Schreibweise. Ersteres ist veraltet und sollte nicht mehr verwendet werden.

Was du also eigentlich suchst ist etwas in Richtung:

Code: Alles auswählen

FILE="test.mkv"
echo $(basename $FILE .mkv).srt
also

Code: Alles auswählen

FILE=$1
SRT=$(basename $FILE .mkv).srt
Gruss syssi

Benutzeravatar
manes
Beiträge: 958
Registriert: 27.08.2007 11:26:54
Wohnort: Köln
Kontaktdaten:

Re: bash-einzeiler, stehe auf dem schlauch

Beitrag von manes » 11.02.2013 23:24:05

hab ich sowas gesucht, $1? noch nie gehört/gelesen. ist $i mit "for i in *.mkv" nicht ausreichend bestimmt?
also so geht's auch nicht:

Code: Alles auswählen

 #!/bin/bash
#ZIEL=~/pfad/zum/zielverzeichnis
FILE=$1
SRT=$(basename $FILE .mkv).srt
for i in *.mkv; do
mkvmerge -v -o $ZIEL/$i $i $SRT;
done
wieder:
Fehler: Die Datei '.mkv.srt' konnte nicht zum Lesen geöffnet werden: open file error.
ich kapier hier was grundsätzliches nicht, fürchte ich.
merkwürdig auch, daß die variante mit sed die untertiteldatei ignoriert und den unveränderten container ins zielverzeichnis muxt.

Code: Alles auswählen

SRT=$(echo $i | sed 's/.mkv$/.srt/')
oder auch

Code: Alles auswählen

SRT=$(echo $1 | sed 's/.mkv$/.srt/')
.

grüße
manes

edit:typo
Sometimes you have a programming problem and it seems like the best solution is to use regular expressions; now you have two problems.
David Mertz

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: bash-einzeiler, stehe auf dem schlauch

Beitrag von linuxCowboy » 12.02.2013 01:38:15

...ich habe eine große zahl von mkv-containern und gleichnamigen separaten srt-untertitelfiles.

Code: Alles auswählen

for i in *.mkv;do echo mkvmerge -o ${i/%.mkv/_subs.mkv} $i --language 0:ger ${i/%mkv/srt};done
Wenn das zu deiner Zufriedenheit ausfällt, hängst du

Code: Alles auswählen

| bash -x
an.

@syssi:
Wohnort: Dänemark
Gruß an den "Adler", eine meine Lieblingsserien! :THX:

-der_linux_cowboy
-der_linux_cowboy --- Besser werden! ... f*** w$$

Benutzeravatar
Meillo
Moderator
Beiträge: 9261
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: bash-einzeiler, stehe auf dem schlauch

Beitrag von Meillo » 12.02.2013 08:12:52

linuxCowboy hat geschrieben:

Code: Alles auswählen

${i/%.mkv/_subs.mkv}
Aber sowas unportables macht man doch nicht wenn es auch portabel geht:

Code: Alles auswählen

${i%.mkv}_subs.mkv
Use ed once in a while!

syssi
Beiträge: 2951
Registriert: 24.12.2010 16:50:59
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rheinland

Re: bash-einzeiler, stehe auf dem schlauch

Beitrag von syssi » 12.02.2013 11:16:41

linuxCowboy hat geschrieben:@syssi:
Wohnort: Dänemark
Gruß an den "Adler", eine meine Lieblingsserien! :THX:
Jep, die Serie ist hier sehr populaer.

syssi
Beiträge: 2951
Registriert: 24.12.2010 16:50:59
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rheinland

Re: bash-einzeiler, stehe auf dem schlauch

Beitrag von syssi » 12.02.2013 11:30:47

manes hat geschrieben:hab ich sowas gesucht, $1? noch nie gehört/gelesen. ist $i mit "for i in *.mkv" nicht ausreichend bestimmt?
Wir haben aneinander vorbei geradet aber egal. Erstmal ein paar Basics:

Man schreibt Skript in Dateien und nutzt sie anschliessend als ausfuehrbares Programm. Angenommen wir nennen dein Skript "addSubtitle.sh", dann wuerdest du das Skript irgendwo im Pfad (z.B. /usr/local/bin) platzieren und einfach aufrufen koennen:

Code: Alles auswählen

addSubtitle.sh
Nun kannst du Parameter an diesen Aufruf anhaengen:

Code: Alles auswählen

addSubtitle.sh sowieso.mkv
Dieser Parameter ist *im* Skript (addSubtitle.sh) ueber die Variable $1 verfuegbar. Die Anzahl der uebergebenen Parameter findet sich in "$#". Mit diesem Wissen kann man schon huebsche Ergebnisse erreichen:

Code: Alles auswählen

#!/bin/bash

if [ $# -eq 1 ];
then
  echo "Parameter 1 lautet $1"
else
  echo "Es wurden zu wenig oder zu viele Parameter uebergeben"
fi
Du versuchst aktuell einen Dateinamen aus "$i" zu holen, obwohl "$i" noch nie belegt wurde. Die Belegung von i hast du bisher ueber die For-Schleife vorgenommen:

Code: Alles auswählen

for i in 1 2 3 4 5;
do
  echo $i
done
Pro Runde wird einer der in-Werte in die Variable "$i" gefuellt. Vor der Schleife ist die Variable logischerweise noch nicht belegt. Wenn du also ohne Uebergabe-Parameter arbeiten willst und im Skript fest verdrahtest, dass ueber eine bestimmte Menge an Dateien gelaufen werden soll, dann solltest du das Gro der Logik in der For-Schleife unterbringen:

Code: Alles auswählen

#!/bin/bash
for i in *.mkv; 
do
  SRT=$(basename $i .mkv).srt
  mkvmerge -v -o $ZIEL/$i $i $SRT;
done
Dann sollte das auch funktionieren.

Gruss syssi

Benutzeravatar
manes
Beiträge: 958
Registriert: 27.08.2007 11:26:54
Wohnort: Köln
Kontaktdaten:

Re: bash-einzeiler, stehe auf dem schlauch

Beitrag von manes » 14.02.2013 18:53:31

vielen dank fürs an-die-hand nehmen und die geduldige erklärung!
kaum macht man es richtig, geht es auch schon.
(meine skriptingschwächen krieg ich seit jahren nicht behoben. besserung ist nicht wirklich in sicht; meine lernkurve ist vor allem: flach. ich poste hier aber nicht leichtfertig, sondern erst, nachdem ich wirklich schon eine weile selber herumgefummelt habe.)

merci nochmal!
manes
Sometimes you have a programming problem and it seems like the best solution is to use regular expressions; now you have two problems.
David Mertz

Antworten