staging.inyokaproject.org

Komplexe case-Statements

Status: Ungelöst | Ubuntu-Version: Kubuntu 17.10 (Artful Aardvark)
Antworten |

moonwalker3

Anmeldungsdatum:
30. Juni 2008

Beiträge: 802

Ich möchte in einer Funktion komplexe case-Statements basteln. Ist das möglich? Also so ungefähr:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17

function meinefunktion {
    case $file in
        $1*$1-aa*)
        echo "irgendwas";
        ;;
        $1*$1-bb*)
        echo "irgendwas andere";
        ;;
    esac
}


for file in *jpg;
do
  meinefunktion "abcde"
done

Oder gibt es eine andere Möglichkeit, dies umzusetzen?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

moonwalker3 schrieb:

Ich möchte in einer Funktion komplexe case-Statements basteln. Ist das möglich?

Das einfachste ist, so etwas auszuprobieren. Warum machst Du das nicht?

1
2
3
4
5
6
7
$ file=preXpre-aa.foo
$ set -- pre
$ case $file in
> $1*$1-aa*) echo ja;;
> *) echo nein;;
> esac
ja

Du solltest die Variablen aber doppelt quoten:

1
2
$ case "$file" in "$1"*"$1"-aa*) echo ja;; *) echo nein;; esac
ja

moonwalker3

(Themenstarter)

Anmeldungsdatum:
30. Juni 2008

Beiträge: 802

rklm schrieb:

Das einfachste ist, so etwas auszuprobieren. Warum machst Du das nicht?

Ich habe es ausprobiert, musste dann Fehler in anderen Zeilen beseitigen.

Ich sehe, dass man jedes "$1" in Anführungszeichen packen muss, eventuelle Leerzeichen müssen mit \ escaped werden. Ich packe Leerzeichen gerne in Anführungszeichen, aber wenn es nicht anders geht, dann egal. Danke.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

@moonwalker3: Ich würde den Dateinamen auch als Argument übergeben, denn wenn Funktionen Variablen verwenden deren Werte nicht übergeben werden, wird es schnell unübersichtlich und schlecht test- und wiederverwendbar.

Statt *.jpg solltest Du ./*.jpg schreiben. Im konkreten Beispiel sehe ich da noch kein Problem mit, aber sonst kann man mit Namen die mit - anfangen Probleme bekommen wenn die irgendwo als Argumente statt als Dateinamen erkannt werden.

moonwalker3

(Themenstarter)

Anmeldungsdatum:
30. Juni 2008

Beiträge: 802

Marc_BlackJack_Rintsch schrieb:

@moonwalker3: Ich würde den Dateinamen auch als Argument übergeben, denn wenn Funktionen Variablen verwenden deren Werte nicht übergeben werden, wird es schnell unübersichtlich und schlecht test- und wiederverwendbar.

Wenn der Dateiname global bekannt ist, dann ist es egal, oder?

Wenn ich schon dabei bin: wie kann ich die Dauer der Ausführung messen? Ich müsste am Anfang des Skripts die Zeit in eine Variable speichern und am Ende die aktuelle Zeit von diesem Wert abziehen. Geht das?

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

moonwalker3 schrieb:

... und am Ende die aktuelle Zeit von diesem Wert abziehen. Geht das?

Sicher geht das.

Nur deutlich einfacher wäre der Befehl time:

1
2
time ./deinskript parameter                 # oder:
time deinefunktion parameter

LG,

track

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

moonwalker3 schrieb:

Ich habe es ausprobiert, musste dann Fehler in anderen Zeilen beseitigen.

Tipp: probiere einzelne Teile aus, die Du ggf. in eine andere Skriptdatei kopierst. Dann kannst Du die Funktionsweise der Bausteine sicher stellen, bevor Du das ganze Skript zusammen baust.

Ich sehe, dass man jedes "$1" in Anführungszeichen packen muss, eventuelle Leerzeichen müssen mit \ escaped werden. Ich packe Leerzeichen gerne in Anführungszeichen, aber wenn es nicht anders geht, dann egal. Danke.

In diesem Fall müssen die $1 einzeln in Anführungsstriche, weil sonst kein Pattern Matching mit dem "*" gemacht wird. Du kannst natürlich Leerzeichen auch in Anführungsstriche packen. Der Zusammenhang ist allerdings unklar, in Deinem Beispiel tauchen ja keine Leerzeichen auf.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

moonwalker3 schrieb:

Marc_BlackJack_Rintsch schrieb:

@moonwalker3: Ich würde den Dateinamen auch als Argument übergeben, denn wenn Funktionen Variablen verwenden deren Werte nicht übergeben werden, wird es schnell unübersichtlich und schlecht test- und wiederverwendbar.

Wenn der Dateiname global bekannt ist, dann ist es egal, oder?

Dann ist was egal wenn man genau das macht was man nicht machen sollte? Wobei man natürlich auf dem Standpunkt stehen kann das Shell-Skripting sowieso nur aus üblen Hacks besteht und nichts mit Programmieren zu tun hat. Also ist eigentlich alles egal. Vergiss das ich was gesagt habe. ☺

Antworten |