staging.inyokaproject.org

Für diese Funktion musst du eingeloggt sein.

Parameter mit Leerzeichen übergeben

Status: Gelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

niki1423

Anmeldungsdatum:
14. Juli 2016

Beiträge: Zähle...

Hallo! Ich bin neu hier in dem Forum hab schon sehr viel gelesen und sehr sehr viel ausprobiert krieg es aber leider nicht hin. Ich hoffe ihr könnt mir helfen! Ich hab ein Skript geschrieben, dass die Werbung entfernt und Untertitel entfernt nach der Aufnahme mit TvHeadend. Ich muss es leider mit 2 Raspberrys machen geht irgendwie nicht anders weil TvHeadend auf Raspbian nicht funktioniert und MKVToolNix gibt es für OpenElec nicht hat ja kein apt-get. Also TvHeadend läuft auf OpenELEC und die Dateien werden auf einer Netzwerkfestplatte gespeichert. Dann wird das 1. Skript auf OpenELEC ausgeführt da sind die richtigen Variablen und Pfade da. Dann rufe ich das andere Skript auf Raspbian auf. Da sind jedoch die Variablen nicht richtig. Wenn ein Leerzeichen in einer Variablen ist, dann wird nicht das ganze Argument übergeben sondern nach dem Leerzeichen wird ein neues Argument gemacht. Ich hab schon verschiedenste Dinge ausprobiert vielleicht liegt der Fehler auch irgendwo anders. 1.Skript auf OpenELEC

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


video="$1" #FULL PATH TO RECORDING /var/media/Aufnahmen/Ordner/video.mkv
videoname="$2" #BASENAME OF RECORDING video.mkv
channel="$3" #CHANNEL NAME das erste hd
title="$4" #PROGRAMM TITLE video
user="$5" #USER DER AUFGENOMMEN HAT user
#BEFEHLE


cd
cd .skript/textdateien
echo "pfad = $video .... datei = $videoname ..... kanal = $channel .... titel = $title ..... benutzer = $user" >> $title.txt

ssh pi@Server .skript/werbung.sh "$video" "$videoname" "$channel" "$title" "$user"

2. Skript auf Raspbian

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/bin/bash
#Variablen


video="$1" #FULL PATH TO RECORDING /var/media/Aufnahmen/Ordner/video.mkv
videoname="$2" #BASENAME OF RECORDING video.mkv
channel="$3" #Channel name ARD
title="$4" #Programm title video
user="$5" #USER user


cd 
cd .skript/textdateien
echo "pfad = $video \n datei = $videoname \n kanal = $channel \n titel = $title \n benutzer = $user" >> $title.txt

Vielen Dank für die Hilfe niki1423

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

H niki1423,

zuerst mal herzlich willkommen hier auf dem Forum !

Das mit den Leerzeichen ist ein typischer Fall, wenn irgendwo (!) auf dem Wege eine Option oder eine Variable nicht sauber "gequotet" ist. Irgendwo auf dem Wege, das heißt auch bereits, wenn Du die Parameter dem Skript mitgibst, und auch nachher bei dem eigentlichen Befehl. (ich denke mal, Dein echo ist nicht der eigentliche Nutzbefehl, sondern nur eine Test-Ausgabe)

Konkret ist z.B. in Deinem Raspbian-Skript die Zeile 14 jedenfalls nicht korrekt "geqotet":

echo "pfad = $video \n datei = $videoname \n kanal = $channel \n titel = $title \n benutzer = $user" >> $title.txt

echo "pfad = $video \n datei = $videoname \n kanal = $channel \n titel = $title \n benutzer = $user" >>  "$title.txt" 

Wie gesagt: es muss überall sauber gequotet sein, bis hinten gegen.
Außerdem werden die "\n" eventuell nicht in Zeilenwechsel umgesetzt, dazu fehlt beim echo ggf. die Option -e (je nach Shell).

Und es ist die Frage, was mit dem "Title.txt" weiter geschieht. Wer verarbeitet den und wie ?
Dann können die ganzen Leerzeichen nämlich auch evt. alles durcheinander bringen.

LG,

track

Planspiel

Anmeldungsdatum:
2. Mai 2016

Beiträge: 673

Schon mal

1
ssh pi@Server ".skript/werbung.sh '$video' '$videoname' '$channel' '$title' '$user'"

ausprobiert?

niki1423

(Themenstarter)

Anmeldungsdatum:
14. Juli 2016

Beiträge: 10

Hallo! Danke für die Antworten aber die Idee von track hat nicht funktioniert jetzt macht er gar nichts mehr. Er hat nichtmal eine Textdatei erstellt. Davor hat er immer eine erstellt mit falschen Namen. Ich hab gedacht wenn man auf eine Variable zugreift auch wenn in der Variable ein String mit Leerzeichen drin steht braucht man nicht quoten. Es geht nur darum wenn man eine Variable in eine andere Variable speichern will und den ganzen String speichern will und nicht das erste Wort. Also so:

1
2
variable1="Hallo Welt"
variable2="$variable1"

und braucht man dann hier welche?

1
2
variable3="/var/media/Hallo\ Welt/"
cd $variable3

Ich werde mal das von Planspiel ausprobieren das hab ich noch nicht gemacht 😉 Danke!

niki1423

(Themenstarter)

Anmeldungsdatum:
14. Juli 2016

Beiträge: 10

Also eine Kombination von beiden Ideen hab ich jetzt und jetzt funktioniert es. Keine Ahnung warum aber es funktioniert. Vielleicht kann ja jemand noch sagen wann man quoten muss und wann nicht. Vielen Dank!

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

So grundsätzlich kann man sagen: wenn irgend ein Leer- oder Sonderzeichen in einem String vorkommt, muss man "quoten".
Hier in Greg's Wiki ist es nochmal schön und ausführlich erklärt.

Zu Deinen konkreten Daten können wir allein deshalb nichts sagen, weil Du uns nicht verraten hast, was in welcher Variablen wirklich drin steht !
In Deinen Skripten gab es jedenfalls nirgends einen Hinweis, wie die einzelnen Daten jeweils aussehen.

Das sinnvollste wäre wahrscheinlich, wenn Du den Inhalt solcher Variablen mal durch Test-Ausgaben genau nachprüfst.
Das könnte z.B. auf dem Raspi so ein Testskript sein:

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

echo "\$1=[$1]"
echo "\$2=[$2]"
echo "\$3=[$3]"
echo "\$4=[$4]"
echo "\$5=[$5]"

Dann siehst Du schon mal, was bis dahin dort ankommt, und ob das sinnvoll ist.
(die Klammern sind nur dafür da, dass Du ggf. ein Leerzeichen hinten dran oder ähnliches Komisches siehst !)

LG,

track

niki1423

(Themenstarter)

Anmeldungsdatum:
14. Juli 2016

Beiträge: 10

Edit Ich habe glaube ich den Fehler entdeckt. Ich muss den kompletten Pfad quoten oder?

1
cd "/var/media/Aufnahmen/"$title""

Hallo also es funktioniert jetzt schon ganz gut. Die Variablen sind richtig in der Textdatei. Es funktioniert nur leider nicht, dass ich in das Verzeichnis wechsle in dem die Aufnahme gespeichert ist.

1
2
3
4
5
6
7
video="$1" #FULL PATH TO RECORDING /var/media/Aufnahmen/Titel der Aufnahme/Titel der Aufnahme.mkv
videoname="$2" #BASENAME OF RECORDING Titel der Aufnahme.mkv
channel="$3" #Channel name ARD
title="$4" #Programm title Titel der Aufnahme
user="$5" #USER user
cd 
cd /var/media/Aufnahmen/"$title"

Oben steht hinter den Variablen was in den Variablen steht. Hab es jetzt noch etwas genauer gemacht. Wenn ich aber versuche in den Ordner zu wechseln, in dem die Datei Titel der Aufnahme.mkv liegt klappt das aber leider nicht die Syntax ist aber richtig oder?

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7529

Ist "$title" jetzt ein Verzeichnisname oder eine Datei? In eine Datei kannst du nicht mit "cd".

Mach als erstes ein set -x dann siehst du was genau die Shell aus deinem Script macht, was genau ausgeführt wird.

Zu deinem Edit, nein, doppelt quoten geht nicht (oder zumindest nicht so). Tatsächlich hört der Quote in deinem Beispiel vor $title auf und nach $title ist dann nochmal ein leerer String. Das ist genau das Gegenteil von "$title".

niki1423

(Themenstarter)

Anmeldungsdatum:
14. Juli 2016

Beiträge: 10

Also title ist ein Verzeichnisname. TvHeadend erstellt für jede Aufnahme einen Ordner mit dem Titel der Aufnahme. Dieser Titel wird in title gespeichert. Und in diesem Ordner ist dann die Datei mit Titel.mkv. TvHeadend übergibt als Pfad den kompletten Pfad bis zur Datei also Titel.mkv ich möchte jedoch in den Ordner darüber kommen also in den Ordner /var/media/Aufnahmen/Titel. Wenn jedoch Titel - wie in den meisten Fällen - länger ist zum Beispiel "Die Simpsons - Der Film" dann wechselt er nicht in das richtige Verzeichnis.

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7529

niki1423 schrieb:

TvHeadend übergibt als Pfad den kompletten Pfad bis zur Datei also Titel.mkv ich möchte jedoch in den Ordner darüber kommen also in den Ordner /var/media/Aufnahmen/Titel.

Dann sehe ich nirgends wo/wie du diesen kompletten Pfad kürzt.

Vielleicht so?

cd $(dirname "$file")

niki1423

(Themenstarter)

Anmeldungsdatum:
14. Juli 2016

Beiträge: 10

Oh das ist ja ein guter Befehl den kannte ich noch gar nicht mit dem werde ich es mal probieren. Ich hab es mit diesem ##*/ probiert hat aber leider nicht geklappt. Das klingt sehr gut Danke!

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

niki1423 schrieb:

Ich habe glaube ich den Fehler entdeckt. Ich muss den kompletten Pfad quoten oder?

1
cd "/var/media/Aufnahmen/"$title""

Nee. Du übersiehst, dass Dein "Quoting" bereits vor der Variablen endet, also ausgerechnet die Variable wieder nackt dasteht !
Das ist ja gerade nicht das was Du willst, und mit Deinem Beispieltitel geht es auch prompt schief:

track@track:~$ title="Die Simpsons - Der Film"
track@track:~$ for x in  "/var/media/Aufnahmen/"$title"";  do echo "[$x]"; done
[/var/media/Aufnahmen/Die]
[Simpsons]
[-]
[Der]
[Film] 

Sobald Du sauber "quotest", ist alles gut, und Du kannst auch mit einer passenden Parameter Expansion den Titel herausschneiden:

track@track:~$ for x in "/var/media/Aufnahmen/$title"; do echo "[$x]"; done
[/var/media/Aufnahmen/Die Simpsons - Der Film]
track@track:~$ for x in "/var/media/Aufnahmen/$title"; do echo "${x##*/}"; done
Die Simpsons - Der Film 

Du solltest allerdings solche Par. Substitutions nicht "blind" abtippen, sondern unbedingt in dem verlinkten Artikel nachlesen, was was macht. Sonst funktioniert es natürlich nicht.

Hier im Fall von cd würde es allerdings auch mit dem kompletten Pfad funktieren, wenn er denn nur sauber "gequotet" ist !

n.b.: wofür hast Du das nackte cd (Z. 13/12) eigentlich in Deinem Skript ?

LG,

track

niki1423

(Themenstarter)

Anmeldungsdatum:
14. Juli 2016

Beiträge: 10

Hallo track! Also jetzt funktioniert es und ich versteh langsam wie man was quoten muss danke! Das cd hat da überhaupt keinen Sinn und des hab ich auch schon raus 😉 Danke! V.G niki1423

apt-ghetto

Anmeldungsdatum:
3. Juni 2014

Beiträge: Zähle...

track schrieb:

n.b.: wofür hast Du das nackte cd (Z. 13/12) eigentlich in Deinem Skript ?

Um sicherzustellen, dass man im richtigen Homeverzeichnis ist?

Antworten |