Wolfgang.Klein
Anmeldungsdatum: 25. Juni 2007
Beiträge: 736
|
Hallo, ich verwende gerne Kontrukte wie | if ! /bin/mountpoint -q $VZ;
then
echo FEHLER!
exit
fi
|
bevor ich ein Skript richtig auf ein Verzeichnis loslasse. Läuft soweit ganz gut. Wie kann ich aber in einer "if"-Entscheidung mehrere Verzeichnisse auf diese Weise testen? Was ich suche, ist die richtige Syntax für die Abfrage, ob von zwei Verzeichnissen beide eingehangen sind, ohne dabei mehr als ein "if" verwenden zu müssen. So funktioniert es nicht: | if ! /bin/mountpoint -q $VZ1 -o ! /bin/mountpoint $VZ2;
then
echo FEHLER!
exit
fi
|
Wer kann mir sagen, wie es richtig lauten muss? Danke im Voraus!
|
frostschutz
Anmeldungsdatum: 18. November 2010
Beiträge: 7744
|
-o geht nicht, das geht nur bei test (innerhalb [ ]) bei Befehlen kannst du und oder mit && || | if ! /bin/mountpoint "$a" || ! /bin/mountpoint "$b"
then
echo "$a" oder "$b" ist kein mountpoint
fi
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13075
|
Eine Möglicheit, das ohne Redundanz zu lösen: 1
2
3
4
5
6
7
8
9
10
11
12
13 | ensure_mp() {
if ! /bin/mountpoint -q "$1"; then
echo "ERROR: not a mount point: $1" >&2
exit 1
fi
}
...
ensure_mp /foo/bar
ensure_mp /bar/foo
...
|
Das kann man natürlich auch direkt in einer Schleife verwenden: | for d in /foo/bar /bar/foo; do
if ! /bin/mountpoint -q "$d"; then
echo "ERROR: not a mount point: $1" >&2
exit 1
fi
done
|
Noch einfacher kann man das so machen: | set -e
{
mountpoint /foo/bar
mountpoint /bar/foo
} >/dev/null
...
|
Dann bekommt man die Fehlermeldung von mountpoint auf Stderr und die Shell bricht das Skript ab (wg. set -e ). Wenn es ein Mountpunkt ist, dann sorgt die Umleitung dafür, dass man die Meldung "... is a mountpoint" nicht sieht.
|
wxpte
Anmeldungsdatum: 20. Januar 2007
Beiträge: 1388
|
Wenn es nur zwei oder drei Verzeichnisse bleiben ▶ wie bei frostschutz beschrieben. Wenn noch einige Verzeichnisse mehr getestet werden sollen, würde ich folgendes vorschlagen:
| #!/bin/bash
for vzg in $vz1 $vz2 $vz3 ... $vzn
do
if ! /bin/mountpoint -q $vzg
then
echo "Beim Mountpoint $vzg ist ein Fehler aufgetreten."; exit
fi
done
|
Edit: rklm war schneller ... @Signatur von rklm: Stimmt, ich war langsamer. 😀
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13075
|
Wolfgang.Klein schrieb:
Wie kann ich aber in einer "if"-Entscheidung mehrere Verzeichnisse auf diese Weise testen? Was ich suche, ist die richtige Syntax für die Abfrage, ob von zwei Verzeichnissen beide eingehangen sind, ohne dabei mehr als ein "if" verwenden zu müssen. So funktioniert es nicht:
Ich wollte dazu noch etwas anmerken: die Lösung, beide (oder mehrere) Prüfungen mit einem if abzuhandeln, hat den Nachteil, dass die Fehlermeldung nicht sagen kann, welcher Mountpunkt fehlt. Das einzelne Testen (so wie in meinen Beispielen) hat den Vorteil, dass man die Rückmeldung bekommt, welcher Mountpunkt fehlt. Ansonsten muss man das dann wieder händisch prüfen.
|
Wolfgang.Klein
(Themenstarter)
Anmeldungsdatum: 25. Juni 2007
Beiträge: 736
|
frostschutz schrieb: -o geht nicht, das geht nur bei test (innerhalb [ ]) bei Befehlen kannst du und oder mit && || | if ! /bin/mountpoint "$a" || ! /bin/mountpoint "$b"
then
echo "$a" oder "$b" ist kein mountpoint
fi
|
Ach menno, das war viel zu einfach für mich. 😉 Danke!
|
Wolfgang.Klein
(Themenstarter)
Anmeldungsdatum: 25. Juni 2007
Beiträge: 736
|
rklm schrieb: Eine Möglicheit, das ohne Redundanz zu lösen:
...
Hmmm, so elegant Deine Lösung auch ist: ob jetzt eigens definierte Funktionen geeignet sind, Redundanz zu verringern, wage ich zu bezweifeln. 🤔
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13075
|
Wolfgang.Klein schrieb: rklm schrieb: Eine Möglicheit, das ohne Redundanz zu lösen:
Hmmm, so elegant Deine Lösung auch ist: ob jetzt eigens definierte Funktionen geeignet sind, Redundanz zu verringern, wage ich zu bezweifeln. 🤔
Na klar, sie wird in dem Beispiel ja mehr als einmal aufgerufen. Ohne Funktion hätte man den Code doppelt oder mehrfach. Ich finde allerdings die letzte Variante am elegantesten, weil man da schon das Shell-Feature nutzt, das Skript bei Fehlern abzubrechen. Ich habe in den meisten meiner Skripte sowieso set -e am Anfang stehen. Das hilft zu verhindern, dass man nach einem Fehler mit einem unklaren Zustand weiter macht.
|
Wolfgang.Klein
(Themenstarter)
Anmeldungsdatum: 25. Juni 2007
Beiträge: 736
|
rklm schrieb:
Ich wollte dazu noch etwas anmerken: die Lösung, beide (oder mehrere) Prüfungen mit einem if abzuhandeln, hat den Nachteil, dass die Fehlermeldung nicht sagen kann, welcher Mountpunkt fehlt. Das einzelne Testen (so wie in meinen Beispielen) hat den Vorteil, dass man die Rückmeldung bekommt, welcher Mountpunkt fehlt. Ansonsten muss man das dann wieder händisch prüfen.
Ja, verstehe. Aber in diesem speziellem Fall sind es wirklich nur 2 Verzeichnisse, die dringend beide eingehangen sein müssen, bevor das Skript sich austoben darf. Da ist die Menge der möglichen Fehler recht übersichtlich. 😉 Aber die Lösungen von wxpte und von rklm sind sehr elegant, die speichere ich mir ab, wer weiß, wann man sie mal brauchen kann. 👍 Danke dafür!
|