anfänger_linux
Anmeldungsdatum: 21. Juni 2017
Beiträge: Zähle...
|
Hallo,bin blutiger Anfänger in Bezug auf Linux und bash.
Habe mich bis jetzt bis auf "for" und "case" heran gearbeitet. 1. "for"
Habe folgende Fragestellung:
Ein Hauptordner, in dem zwei Unterordner (Ordner1,Ordner2) sind,die einige mkv's beinhalten.
Ich möchte nun die mkv's im Ordner1 mit der mkv's im Ordner2 muxen
mit mkvmerge (mkvtoolnix) (beliebeige Audiospur etc.).
Wollte dafür zwei "for" Schleifen,jeweils für Ordner1 und Ordner2 schreiben, weiß aber nicht,wie ich beide Schleifen miteinander verebinden soll. | #!/bin/bash
#muxen
for i in *.mkv
do
i="${i%.mkv} mkvmerge -o..
done
|
2."case" Habe ein Skript bereits geschrieben,das wie folgt aussieht | #!/bin/bash
#test
read -p "Ihr Name?:" name
case "$name" in
name1) echo "hallo,name1"
;;
name2) echo "hallo,name2"
;;
esac
|
Nun möchte ich,dass das Skript nicht mit einer Eingabe eines Namens beendet wird ,sondern weiterhin ausgeführt wird.
Wenn ich das Skript ausführe und einen Namen eingebe,wird es beendet und ich muss erneut das Skript starten. Danke im Voraus Bearbeitet von sebix: Bitte verwende in Zukunft Codeblöcke, um die Übersicht im Forum zu verbessern!
|
sebix
Moderator, Webteam
Anmeldungsdatum: 14. April 2009
Beiträge: 5350
|
anfänger_linux schrieb: Ich möchte nun die mkv's im Ordner1 mit der mkv's im Ordner2 muxen
Heissen die Dateien gleich, oder sind sie bloss in der richtigen Reihenfolge sortiert? Nun möchte ich,dass das Skript nicht mit einer Eingabe eines Namens beendet wird ,sondern weiterhin ausgeführt wird.
Was soll es dann tun?
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Ad 2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | #!/bin/bash
for ((;;))
do
read -p "Ihr Name?: (quit beendet)" name
case "$name" in
name1) echo "hallo, name1"
;;
name2) echo "hallo, name2"
;;
quit) exit
;;
esac
done
|
Ein Hauptordner, in dem zwei Unterordner (Ordner1,Ordner2) sind,die einige mkv's beinhalten. Ich möchte nun die mkv's im Ordner1 mit der mkv's im Ordner2 muxen mit mkvmerge (mkvtoolnix) (beliebeige Audiospur etc.).
Mit den?
Willst Du alle mit allen muxen?
Wie sieht ein Befehl aus, um 1x1 zu muxen? Ich hab's nicht so mit muxen.
|
anfänger_linux
(Themenstarter)
Anmeldungsdatum: 21. Juni 2017
Beiträge: 7
|
@sebix
Die Dateien sind in der korrekten Reihenfolge,wobei der Name der Datei im Ordner1 übernommen werden soll. Für case, soll auf eine weitere Eingabe eines Namens auffordern
|
anfänger_linux
(Themenstarter)
Anmeldungsdatum: 21. Juni 2017
Beiträge: 7
|
@user_unknown
Die Dateien sind sortiert 1,2... Und es sollen nur Datei 1 Ordner1 und Datei 1 Ordner2 gemuxt werden.
Habe bisher mkvtoolnix mgui benutzt,
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Du füllst die Dateinamen in 2 Arrays und gehst diese mit einem gemeinsamen Index durch: | # Prämisse: Keine Leerzeichen etc. im Dateinamen
ar1=(Ordner1/*.mkv) ar2=(Ordner2/*.mkv)
len=$((${#ar1[@]}-1))
for i in $(seq 0 $len)
do
echo $i": "${ar1[i]} ${ar2[i]}
done
|
Statt echo $i": " nimmst Du Dein Kommando, wenn man diesem einfach die 2 Dateien als Parameter übergibt.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12832
|
Herzlich willkommen im Forum! anfänger_linux schrieb: Hallo,bin blutiger Anfänger in Bezug auf Linux und bash.
Habe mich bis jetzt bis auf "for" und "case" heran gearbeitet.
Bitte beim nächsten Mal zwei Themen eröffnen. Es handelt sich um ganz unterschiedliche Fragestellungen, wie Du ja auch schon erkannt hast, und die handelt man deshalb besser in verschiedenen Themen ab. Weitere Details Richtig fragen
|
anfänger_linux
(Themenstarter)
Anmeldungsdatum: 21. Juni 2017
Beiträge: 7
|
rklm schrieb: Herzlich willkommen im Forum! anfänger_linux schrieb: Hallo,bin blutiger Anfänger in Bezug auf Linux und bash.
Habe mich bis jetzt bis auf "for" und "case" heran gearbeitet.
Bitte beim nächsten Mal zwei Themen eröffnen. Es handelt sich um ganz unterschiedliche Fragestellungen, wie Du ja auch schon erkannt hast, und die handelt man deshalb besser in verschiedenen Themen ab. Weitere Details Richtig fragen
Danke, werde es in Zukunft so machen.
|
anfänger_linux
(Themenstarter)
Anmeldungsdatum: 21. Juni 2017
Beiträge: 7
|
user_unknown schrieb: Ad 2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | #!/bin/bash
for ((;;))
do
read -p "Ihr Name?: (quit beendet)" name
case "$name" in
name1) echo "hallo, name1"
;;
name2) echo "hallo, name2"
;;
quit) exit
;;
esac
done
|
Ein Hauptordner, in dem zwei Unterordner (Ordner1,Ordner2) sind,die einige mkv's beinhalten. Ich möchte nun die mkv's im Ordner1 mit der mkv's im Ordner2 muxen mit mkvmerge (mkvtoolnix) (beliebeige Audiospur etc.).
Mit den?
Willst Du alle mit allen muxen?
Wie sieht ein Befehl aus, um 1x1 zu muxen? Ich hab's nicht so mit muxen.
Danke user_unknown, das Skript macht genau das, was ich wollte.
Die Klammern () stehen doch für eine Gruppierung von Befehlen, warum stehen sie jetzt in doppelter Ausführung?
Liegt es daran, das ";" bereits einen Befehl zugeordnet wird und die innere Klammern den "case" Befehl markiert?
Ich wollte auch noch das Skript erweitern,indem ich die eingegebenen Namen in eine Text Datei abspeichere.
Habe es mit der Umleitung " > name.txt " versucht, weiß aber nicht, wo ich sie innerhalb des "case" Befehl oder der "for" Schleife
eintragen soll.
Sorry das ich Dich so mit Fragen löchere..
|
anfänger_linux
(Themenstarter)
Anmeldungsdatum: 21. Juni 2017
Beiträge: 7
|
user_unknown schrieb: Du füllst die Dateinamen in 2 Arrays und gehst diese mit einem gemeinsamen Index durch: | # Prämisse: Keine Leerzeichen etc. im Dateinamen
ar1=(Ordner1/*.mkv) ar2=(Ordner2/*.mkv)
len=$((${#ar1[@]}-1))
for i in $(seq 0 $len)
do
echo $i": "${ar1[i]} ${ar2[i]}
done
|
Statt echo $i": " nimmst Du Dein Kommando, wenn man diesem einfach die 2 Dateien als Parameter übergibt.
Danke user_unknown,werde das Skript die Tage mal ausprobieren
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
anfänger_linux schrieb: user_unknown schrieb: Ad 2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | #!/bin/bash
for ((;;))
do
read -p "Ihr Name?: (quit beendet)" name
case "$name" in
name1) echo "hallo, name1"
;;
name2) echo "hallo, name2"
;;
quit) exit
;;
esac
done
|
Danke user_unknown, das Skript macht genau das, was ich wollte.
Die Klammern () stehen doch für eine Gruppierung von Befehlen, warum stehen sie jetzt in doppelter Ausführung?
Es handelt sich um eine degenerierte for-Schleife. Lt. man bash: for (( expr1 ; expr2 ; expr3 )) ; do list ; done
First, the arithmetic expression expr1 is evaluated according to the rules described below under ARITHMETIC EVALUATION. The arithmetic expression expr2
is then evaluated repeatedly until it evaluates to zero. Each time expr2 evaluates to a non-zero value, list is executed and the arithmetic expression
expr3 is evaluated. If any expression is omitted, it behaves as if it evaluates to 1. The return value is the exit status of the last command in list
that is executed, or false if any of the expressions is invalid. Expr1, 2 und 3 sind leer. Die doppelten, runden Klammern sind fester Syntaxbestandteil der For-Schleife, besser gesagt einer von mehreren Formen von For-Schleifen. Es ist keine Zusammensetzung mehrerer Syntaxelemente, die getrennt voneinander erklärt werden können, soweit ich weiß.
Liegt es daran, das ";" bereits einen Befehl zugeordnet wird und die innere Klammern den "case" Befehl markiert?
Bei Mehrzahl Klammern ist auch von inneren Klammern zu sprechen, umgekehrt bei Einzahl innere Klammer auch von Einzahl Klammer. Soll ich mir aussuchen, wovon Du sprichst oder rätseln?
Wenn möglich, formuliere sorgfältiger. Gut - manche können das nicht. Es ist aber schwierig zu entziffern, was Du meinst. "Den Casebefehl" sehe ich auch nicht - ich sehe 3 Case-Fälle und ein Schlüsselwort "case", letzteres hat aber keine Klammer. All das sehe ich auch nicht als innerhalb an, denn die doppelten For-Klammern sind ja längst geschlossen.
Ich wollte auch noch das Skript erweitern,indem ich die eingegebenen Namen in eine Text Datei abspeichere.
Habe es mit der Umleitung " > name.txt " versucht, weiß aber nicht, wo ich sie innerhalb des "case" Befehl oder der "for" Schleife
eintragen soll.
Sorry das ich Dich so mit Fragen löchere..
Da hilft a) Buch, Tutorials, Beispielscripte und ähnliches lesen sowie b) ausprobieren, ausprobieren, ausprobieren - immer kleine Beispiele auf einmal, jede Frage einzeln klären. echo foo > foo.txt überschreibt jedenfalls eine zuvor existierende Datei foo.txt und unterdrückt die Ausgabe auf den Bildschirm - es wird ja umgeleitet in die Datei.
echo foo >> foo.txt würde anhängen, echo foo | tee foo.txt leitet die Ausgabe zusätzlich zum Bildschirm in die Datei und echo foo | tee -a foo.txt leitet auf Schirm und in Datei, hängt aber an diese an, falls sie bereits existiert.
Tee ist die englische Aussprache für "T" und das Te symbolisiert eine Rohrleitung oder Elektroleitung oder ein Flußdiagramm mit einem Eingang und zwei Ausgängen (Bildschirm, Datei). -a steht für apppend, also anhängen (an eine optional existierende Datei). 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | #!/bin/bash
for ((;;))
do
read -p "Ihr Name?: (quit beendet)" name
case "$name" in
name1) echo "hallo, name1"
;;
name2) echo "hallo, name2"
;;
quit) exit
;;
esac
done > testlog.txt
bash endless.sh
Ihr Name?: (quit beendet)name1
Ihr Name?: (quit beendet)name2
Ihr Name?: (quit beendet)nome3
Ihr Name?: (quit beendet)quit
|
Ausgabe der testlog.txt:
| hallo, name1
hallo, name2
|
|
anfänger_linux
(Themenstarter)
Anmeldungsdatum: 21. Juni 2017
Beiträge: 7
|
user_unknown schrieb: Ad 2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | #!/bin/bash
for ((;;))
do
read -p "Ihr Name?: (quit beendet)" name
case "$name" in
name1) echo "hallo, name1"
;;
name2) echo "hallo, name2"
;;
quit) exit
;;
esac
done
|
@user_unknown
Bezüglich der Klammern (siehe Skript, Zeile 3). | #!/bin/bash
for ((;;))
..
done
|
mit den inneren Klammern meinte ich '( ;; )' in der "for" Schleife.
Und da der 'case' Befehl mit ';;' abschließt, dachte ich, dass es einen Zusammenhang zwischen '(;😉' und den darauf folgenden 'case'
befehlen besteht.
Nochmals danke für die schnelle Hilfe
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Deine Überlegungen gehen hier fehl: in diesem Fall ist die ((Doppelklammer)) selber so komplett, wie sie da steht, das Merkmal: Genau wie bei der Shell Arithmetik wird bei der arithmetischen Variante des for - Befehls die ((Doppelklammer)) zur Markierung benutzt. Deshalb gibt es hier nichts weiter zu zerlegen, und es ist auch nur eine Frage der Kontinuität, dass innerhalb der for - ((Klammer)) das ; als Trenner benutzt wird. - das ist einfach nur eine freie Festlegung. LG, track
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12832
|
Für eine Endlosschleife würde ich allerdings lieber eine dieser Formen verwenden:
| while :; do
...
done
while true; do
...
done
|
Vorteil ist, dass das Verfahren auch in der sh und generell jeder POSIX-Shell funktioniert.
|