Deavy
Anmeldungsdatum: 11. Oktober 2012
Beiträge: 126
Wohnort: Berlin
|
Hi, bevor ich noch ewig im Netz suche frag ich einfach mal hier ist bestimmt ganz leicht ☺ Also wenn ich mit read einen Dateinamen speichern will sagen wir ich gebe dann "datei" ein nur im Ordner existiert die datei schon,
wie mach ich das dann dass die frage wiederholt wird bis ein passender Dateiname gefunden wurde? mfg
Deavy
|
mrkramps
Anmeldungsdatum: 10. Oktober 2006
Beiträge: 5523
Wohnort: south central EL
|
If-Abfrage mit einem File test operator 🇬🇧.
|
Deavy
(Themenstarter)
Anmeldungsdatum: 11. Oktober 2012
Beiträge: 126
Wohnort: Berlin
|
Das ging aber schnell danke ☺ Und wie mach ich das das er automatich die Frage wiederholt?
|
g00d.morning
Anmeldungsdatum: 20. Februar 2013
Beiträge: 330
|
Morgen 😉 Sowas z.B.? | #!/bin/bash
while [[ ! $filename ]] || [[ -e $filename ]]; do
read -p "Geben Sie einen Dateinamen an: " filename
if [[ -e $filename ]]; then
echo "Die Datei $(pwd)/$filename existiert bereits."
fi
done
|
Diese while-Schleife prüft, ob die Variable leer ist oder eine Datei/ein Order im aktuellen Verzeichnis mit gleichem Namen existiert. Das "!" ist eine Negation (in diesem Fall von Existenz).
|
Deavy
(Themenstarter)
Anmeldungsdatum: 11. Oktober 2012
Beiträge: 126
Wohnort: Berlin
|
Ja schaut schonmal gut aus und wo schreib ich den Befehl hin der dann ausgeführt werden soll? geht es nicht auch einfach so? | read -p "Name: " rec
if [ -e "$rec.ts" ]
then
echo "Datei schon Vorhanden."
sh /pvr.sh
else
cat /dev/video0 > $HOME/Videos/PVR/$rec.ts
fi
|
also das falls die Datei schon vorhanden ist einfach das Script nochmal neustartet, oder ist das problematisch wegen den prozessen oder sonstigem? Andernfalls wäre es auch möglich einfach hinten an die Datei eine steigende Nummer anzuhängen.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Wenn das Skript immer wieder sich selber aufruft, und Du 200 vergebliche Versuche hast, dann startest Du das Ding ja 200x ineinander. Das heißt, dass es hinterher auch 200x versucht, sich irgendwie zu Ende zu bringen ... (ist also nicht so ganz das Wahre) Sinnvollerweise würde man wohl eine while - Schleife verwenden: | read -p "Name: " rec
while [ -e "$rec.ts" ] ; do
echo "Datei schon vorhanden."
read -p "neuer Name: " rec
done
cat /dev/video0 > $HOME/Videos/PVR/$rec.ts
|
LG, track
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: Zähle...
|
g00d.morning schrieb:
| #!/bin/bash
while [[ ! $filename ]] || [[ -e $filename ]]; do
read -p "Geben Sie einen Dateinamen an: " filename
if [[ -e $filename ]]; then
echo "Die Datei $(pwd)/$filename existiert bereits."
fi
done
|
Die Ausgabe der Meldung, dass die Datei existiert hat zwei Probleme: Du testest mit "-e", d.h. das Objekt kann auch ein Verzeichnis, ein Socket oder was auch immer sein. Von daher ist der Text nicht ganz richtig. Wenn ein absoluter Pfad angegeben wird, dann ist das Voranstellen von $(pwd) falsch.
Diese while-Schleife prüft, ob die Variable leer ist oder eine Datei/ein Order im aktuellen Verzeichnis mit gleichem Namen existiert.
Man kann sich ein Paar von Klammern sparen und die Bedingung in diesem Fall auch so schreiben: | while [[ ! $filename || -e $filename ]]; do
|
Damit das wirklich robust wird, müsste man noch ein unset filename vor die Schleife setzen. 😉 Eine andere Variante sähe so aus und würde einen Test sparen: |
filename=.
while [[ -e $filename ]]; do
read -p "Geben Sie einen Dateinamen an: " filename
[[ -e $filename ]] && echo "'$filename' existiert bereits."
# Alternative mit absolutem Pfad:
# [[ -e $filename ]] && echo "'$(readlink -f "$filename")' existiert bereits."
done
|
Das "!" ist eine Negation (in diesem Fall von Existenz).
Das ist nicht ganz richtig. In diesem Fall ist der negierte Test der auf eine nicht leere Zeichenkette. Das ist die Beschreibung des Tests in der Manpage der bash : string
-n string
True if the length of string is non-zero. Es ist also egal, ob "filename" mit einem leeren String angelegt wurde oder gar nicht existiert.
|
g00d.morning
Anmeldungsdatum: 20. Februar 2013
Beiträge: 330
|
rklm schrieb: |
filename=.
while [[ -e $filename ]]; do
read -p "Geben Sie einen Dateinamen an: " filename
[[ -e $filename ]] && echo "'$filename' existiert bereits."
# Alternative mit absolutem Pfad:
# [[ -e $filename ]] && echo "'$(readlink -f "$filename")' existiert bereits."
done
|
Hallo rklm. Ich habe ein nur ein Beispiel gegeben (mit ein paar ungenauen Aussagen, zugegeben). Dein Beispiel ist aber - mit Verlaub - auch nicht ganz solide. Dieses Script würde ja einen leeren String erlauben. Denn "." würde mit einem leeren String überschrieben, wenn man nur Enter drückt.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: Zähle...
|
g00d.morning schrieb: Dein Beispiel ist aber - mit Verlaub - auch nicht ganz solide. Dieses Script würde ja einen leeren String erlauben. Denn "." würde mit einem leeren String überschrieben, wenn man nur Enter drückt.
Guter Punkt! Dann kommt man um die zweifache Bedingung nicht herum. Schade eigentlich. Danke für die Rückmeldung! Bis dann robert
|
frostschutz
Anmeldungsdatum: 18. November 2010
Beiträge: 7737
|
track schrieb: Wenn das Skript immer wieder sich selber aufruft, und Du 200 vergebliche Versuche hast, dann startest Du das Ding ja 200x ineinander.
Das kann man mit exec umgehen. Aber solche rekursiven Skripte sind schwer zu verstehen. Dann lieber eine saubere while-Schleife. Du musst nicht nur prüfen daß die Datei noch nicht existiert - dabei ordentlich quoten, also immer "$file" statt $file - sondern auch daß sie sich erstellen läßt (z.B. mit touch), sonst akzeptierst du illegale Dateinamen und hast dann später ein Problem.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: Zähle...
|
frostschutz schrieb:
Du musst nicht nur prüfen daß die Datei noch nicht existiert - dabei ordentlich quoten, also immer "$file" statt $file
Tatsächlich dürfte das Quoten in [[ ]] überflüssig sein, denn lt. Manpage der bash : [[ expression ]]
Return a status of 0 or 1 depending on the evaluation of the conditional expression expression.
Expressions are composed of the primaries described below under CONDITIONAL EXPRESSIONS. Word split‐
ting and pathname expansion are not performed on the words between the [[ and ]]; tilde expansion,
parameter and variable expansion, arithmetic expansion, command substitution, process substitution, and
quote removal are performed. Conditional operators such as -f must be unquoted to be recognized as
primaries. - sondern auch daß sie sich erstellen läßt (z.B. mit touch), sonst akzeptierst du illegale Dateinamen und hast dann später ein Problem.
Die Frage ist, wie weit man das treiben will: selbst wenn der touch jetzt erfolgreich ist, bedeutet das nicht verlässlich, dass das Anlegen oder Schreiben zu einem späteren Zeitpunkt sicher funktionieren wird.
|
Deavy
(Themenstarter)
Anmeldungsdatum: 11. Oktober 2012
Beiträge: 126
Wohnort: Berlin
|
Hi, habe ein neues Problem, aber erstmal danke schon mal ☺ ps. Das HD PVR ist ein gerät mit dem man von der PS3 über USB am Rechner aufnehmen kann. (Das war bei VLC 2.0.x noch problemlos möglich doch seit dem neuen VLC 2.1.x ist das gerät dort nicht mehr zu finden, nur noch über Video Camera als /dev/video0/ und da kann er das Video nicht wiedergeben, codec wird mir 4:2:0 YUV angezeigt sonst war es H264 Mpeg-4, das nervt mich am meisten, kompilieren der alten version kriege ich nicht hin ☹) So, mit dem Script habe ich das Problem das sobald ich eine Aufnahme gestartet habe ich das nur mit STRG+C beenden kann, ich würde es aber gerne mit Leertaste beenden habe es mit xte und so Probiert und das ich das Script in einem Separaten Fenster öffne das hat aber nicht geklappt alles, wie mache ich das noch? 😀 ps. wenn ich das Script hier : | read -p "Name: " rec
while [ -e "$rec.ts" ] ; do
echo "Datei schon vorhanden."
read -p "neuer Name: " rec
done
cat /dev/video0 > $HOME/Videos/PVR/$rec.ts
|
oder ein anderes aus dem Thread nehme dann macht das Script jedes mal eine Aufnahme auch wenn die Datei schon vorhanden ist.
|
frostschutz
Anmeldungsdatum: 18. November 2010
Beiträge: 7737
|
Ich hab den Faden verloren aber meinst du sowas: cat dings > bums &
dingsbums=$!
read -p "Hemmem? "
kill $dingsbums
|
g00d.morning
Anmeldungsdatum: 20. Februar 2013
Beiträge: 330
|
Dein neues Problem wurde ja schon einmal von diesem abgetrennt: klick! Zu Deinem ursprünglichen Problem: Deavy schrieb: So, mit dem Script habe ich das Problem das sobald ich eine Aufnahme gestartet habe ich das nur mit STRG+C beenden kann, ich würde es aber gerne mit Leertaste beenden habe es mit xte und so Probiert und das ich das Script in einem Separaten Fenster öffne das hat aber nicht geklappt alles, wie mache ich das noch? 😀 ps. wenn ich das Script hier : | read -p "Name: " rec
while [ -e "$rec.ts" ] ; do
echo "Datei schon vorhanden."
read -p "neuer Name: " rec
done
cat /dev/video0 > $HOME/Videos/PVR/$rec.ts
|
oder ein anderes aus dem Thread nehme dann macht das Script jedes mal eine Aufnahme auch wenn die Datei schon vorhanden ist.
Du musst natürlich das Verzeichnis überprüfen, in dem die Datei gespeichert wird!
while [ -e "$HOME/Videos/PVR/$rec.ts" ] ; do
|
Deavy
(Themenstarter)
Anmeldungsdatum: 11. Oktober 2012
Beiträge: 126
Wohnort: Berlin
|
g00d.morning schrieb: Dein neues Problem wurde ja schon einmal von diesem abgetrennt: klick!
Ah ok, habe mich schon grfragt wo mein Post von heute Mittag hin ist 😛
Zu Deinem ursprünglichen Problem:
Du musst natürlich das Verzeichnis überprüfen, in dem die Datei gespeichert wird!
while [ -e "$HOME/Videos/PVR/$rec.ts" ] ; do
Ja aber in dem Script bin ich schon mit cd in den Ordner gewechselt, ist das nicht das gleiche? Edit: ok, so klappt es nun ☺ frostschutz schrieb: Ich hab den Faden verloren aber meinst du sowas: cat dings > bums &
dingsbums=$!
read -p "Hemmem? "
kill $dingsbums
Perfekt ☺
|