Zufallsgesteuerte Sript-Blöcke

  • Hallo,
    ich habe eine sh-Datei mit 3 "Abschnitten".
    Beim Aufruf der sh-Datei soll zufällig einer der Abschnitte abgearbeitet werden, die anderen sollen nicht ausgeführt werden.


    Wie setze ich soetwas bezüglich Syntax, random-Funktion, Variablen und if um?


    Danke!


    blueink

    yavdr| intel softhddevice | Hasswell i5 4460) | Mainboard GA-H81M-HD3 Intel H81 | 8 GB Ram |
    DVB-S2 Twintuner Digital Devices Cine S2 Rev 5.5 | TFT 27" (DVI) | Sound SPDIF -> Denon AVR-X4000
    Homebrew lirc (serial) | LCD 320x240 SED1330 (parport) | 128 GB System SSD, 2x2TB HDD ZFS

  • Hi,


    in der bash gibt es die Variable "RANDOM".


    Wenn Du diese Variable referenzierst, erhälst Du jedes Mal einen neuen wert.


    Für Dein Skript heisst das:


    Code
    let VAR1= ($RANDOM % 3)


    Anschließend ganz normale IF-Abfrage auf den Wert von VAR1... oder CASE, je nach Geschmack.


    rael

  • klappt wunderbar, vielen Dank!
    Was macht denn das let? In vielen oder den meisten Beispielen wird es nicht verwendet.

    yavdr| intel softhddevice | Hasswell i5 4460) | Mainboard GA-H81M-HD3 Intel H81 | 8 GB Ram |
    DVB-S2 Twintuner Digital Devices Cine S2 Rev 5.5 | TFT 27" (DVI) | Sound SPDIF -> Denon AVR-X4000
    Homebrew lirc (serial) | LCD 320x240 SED1330 (parport) | 128 GB System SSD, 2x2TB HDD ZFS

  • Hi,


    let... naja, ist etwas archaich, denke ich :) Wurde halt früher zur Zuweisung beuntzt, insbesondere, wenn in der Shell gerechnet werden sollte / musste. Ich meine mich zu erinnern, dass alte bash-Versionen (< 1.4? So um 1989 herum) nicht direkt rechnen konnten, da half dann nur let oder so.


    Geht aber vermutlicherweise bei modernen Systemen auch ohne let. Just give it a try.


    Schön, dass es klappt für Dich.


    rael

  • Zitat

    Original von blueink
    klappt wunderbar, vielen Dank!
    Was macht denn das let? In vielen oder den meisten Beispielen wird es nicht verwendet.


    let ist gut für Berechnungen und durchaus nicht antiquiert. Damit kannst du Grundrechenarten durchführen, nach links oder rechts shiften, modulo rechnen und so weiter.

  • HI wirbel,


    danke für das "durchaus nicht antiqiert".


    Wenn ich die Manpage der Bash jedoch richtig interpretiere, erreicht man das heutzutage auch relativ leicht durch (( ... )), oder sehe ich das falsch??


    Code
    ((expression))
                  The expression is evaluated according  to  the  rules  described
                  below  under ARITHMETIC EVALUATION.  If the value of the expres-
                  sion is non-zero, the return status is 0; otherwise  the  return
                  status is 1.  This is exactly equivalent to let "expression".


    War aber früher eben nicht so... und ausserdem hat ja seinerzeit nicht jeder eine bash als Shell verwendet...


    rael

  • Na dann habe ich ja mit wert=$((RANDOM%3+1)) im Grunde let verwendet ;)

    yavdr| intel softhddevice | Hasswell i5 4460) | Mainboard GA-H81M-HD3 Intel H81 | 8 GB Ram |
    DVB-S2 Twintuner Digital Devices Cine S2 Rev 5.5 | TFT 27" (DVI) | Sound SPDIF -> Denon AVR-X4000
    Homebrew lirc (serial) | LCD 320x240 SED1330 (parport) | 128 GB System SSD, 2x2TB HDD ZFS


  • Bei deinem Zitat geht es um komplett etwas anderes, um die Auswertung eines Ausdrucks entsprechend Null oder ungleich Null, z.B. nützlich für Tests, Loops und If.
    let aber weist einer Variablen einen Wert zu. Und nebenbei werden die Scripte lesbarer.

  • I beg to differ:


    Zitat

    let arg [arg ...]
    Each arg is an arithmetic expression to be evaluated (see ARITH-
    METIC EVALUATION). If the last arg evaluates to 0, let returns
    1; 0 is returned otherwise.


    IMHO ist ausserdem das Wort "equivalent" hinreichend stark.


    Also in der bash sollte -laut diesen Excerpts der Manpage- beides gleich funktionieren.


    Ansonsten müsste ich mal nen English- und Logikkurs buchen, damit mir die Bedeutung von equivalent nahegelegt wird :-))


    Aber unabhängig von let oder ((....)): Wichtig ist, dass es -plattformübergriefend- funktioniert.


    rael

  • Was mir noch nicht so ganz klar ist, wie das in andren Shells (ksh, zsh, ..) aussähe wenns plattformübergreifend werden soll.

  • Hmm,


    also für "mich2 ist plattformübergreifend: Auf unterschiedlicher HW (ARM, RISC, Intel...) und -wenns schön ist- auch auf unterschiedlichenUnix-Derivaten (Linux, SCO, ISC, FreeBSD, AIX, HPUX, Solaris (jemanden vergessen))....


    Mit anderen Shells _kann_ das IMHO nicht funzen. Ich meine, #!/bin/perl ist ja auch nicht kompatibel mit #!/bin/sh :-))


    Aber da Bash "überall" läuft, ist das ja schonmal gegeben.


    Wichtig ist nur, dass es mit nahezu allen Versionen der Bash läuft.... und die alten Version kannten imho nur "let", aber eben nicht ((...)).


    Oder was meinst Du mit "plattformübergreifend"?


    rael

  • Ich meinte ausschließlich im Zusammenhang mit vdr, also ist sowohl die Hardware bekannt als auch die Auswahl der Systeme begrenzt.




    Die bash ist nicht auf allen Systemen default, zumindest haben wir einige Systeme auf Arbeit bei denen zsh default ist und die bash in /usr/bin liegt. Auf nem standard linux hab ich das zum Glück noch nie so gefunden.
    Aber in diesem speziellen Falle wäre sowohl ein #!/bin/sh was auf zsh verweist als auch ein #!/bin/bash falsch gewesen.

  • Hmm,


    sagen wir mal so: dazu hat der liebe Gott (oder wer auch immer) den LFS (Linux Filesystem standard) ins Leben gerufen.


    Darin steht festgeschrieben, wo welche bins (sofern sie wichtig sind) liegen sollen.


    zB dass ls, rm usw im root-Pfad liegen müssen (und der ist üblicherweise auf /bin, /usr/bin und /sbin eingeschränkt, zumindest bei mir).


    Und wenn ich das richtig sehe, liegen die "wesentlichen" shells unter /bin/, aber ich lasse mich gerne eines besseren belehren.


    Das /bin/sh != /bin/bash ist, DAS wiederum ist mir klar.


    Problematisch ist es immer, wenn die Leute /bin/sh für die bash halten und andere /bin/sh auf minimal-Shells wie die sh oder ähnliches verlinken... dann ist natürlich Feuer am Dach....


    Aber stimmt schon: Wenn /bin/sh auf etwas anderes verweist als bash, dann wird es problematisch. Ich kenne jetzt zsh nicht so gut, aber wen sie als /bin/sh aufgerudfen wird, muss (!!) sie sich zumindest ansatzweise wie ein /bin/sh (also die alte Bourne Shell) verhalten. Alles andere ist nocht Posix-konform.


    Leider konnte die alte Shell nicht rechnen :-/ Und auch vieles andere nicht, was ja seinerzeit den Siegeszug der csh und anschließend der tcsh eingeläutet hatte...


    Aber awk würde einem hier viel Arbeit abnehmen... kann zumindest Rechnen und auch sonst einiges. Und awk wiederum liegt -nach dem Mounten der lokalen Filesysteme- idR im Pfad. Aber awk spricht ja keiner mehr ... jetzt wo es Perl und sonstwas gibt.


    Moment, schaue mal eben nach, wie die Syntax der zsh ausschaut: Naja


    Code
    COMPATIBILITY
           Zsh  tries to emulate sh or ksh when it is invoked as sh or ksh respec-
           tively; more precisely, it looks at the first letter  of  the  name  by
           which  it  was invoked


    Also auch nicht prickelnd. Problem ist: /bin/sh kannhalt garnix.


    Um dann wiederum plattformübergreifend zu werden, bliebe einem letztendlich nur ein statisch gelinktes C-Programm... da gibt es rand() und allen anderen Kram, den man bräuchte. DIe IF-Abfragen sollten wieder im Sprachumfang der /bin/sh definiert sein.


    So würde ich es vermutlicherweise machen: leines C-Programm, welches zufällig 1-3 ausgibt, zur Sicherheit und zur Unabhängigkeit von irgendwelchen libs statisch gelinkt und there you go. Leider nicht sehr elegant. Oder aber awk hernehmen.


    Gegenfrage: Du schreibst: hier auf der arbeit ... standardlinux zum glück noch nicht...


    Was für ein Linux setzt ihr denn ein, wenn es kein Standard ist??


    rael

  • Zitat

    Original von rael
    Was für ein Linux setzt ihr denn ein, wenn es kein Standard ist??


    Es gibt auch noch andere (POSIX-konforme) UNIXe neben Linux ;)


    EDIT:
    Bei unseren HP-Dosen wird z.B. standardmäßig /bin/ksh (Korn-Shell) als sh verlinkt.

  • Hi,


    klaro, ein paar Artikel drüber liste ich ja auch eine handvoll davon auf :-))


    Und yup: HP-UX schiesst -zumindest was die Shell angeht- immer ein bisschen quer :)


    War der Grund, warum wir bei uns an der Uni immer die Bash nachgezogen haben... was ja bei vorhandenem Compiler kein Problem ist.
    Meine Frage bezog sich darauf, dass bei wirbel auf Schicht ja Linux eingesetzt wird, aber eben nicht /bin/bash da ist. Was ich für eine Ausnahme halte... unter Linux. Daher interessierte mich das, welche Distro das wohl wäre...


    Deswegen ja auch der vorgeschlagene Weg über ein AWK-Skript, wenn man wirklich unabhängig werden will... awk ist wohl auf nahezu allen UNIX-Versionen vorhanden, und der Sprachumfang ist auch definiert.


    Wobei blueink mit der von mir vorgeschlagenen Lösung ja wohl zufrieden ist :-))


    So, jetzt aber grillen,


    rael

  • Achso, sorry Frage falsch verstanden. Dachte wirbel hantiert auch mit Nicht-Linux-Büchsen rum ;)


    Bei uns wird übrigens tatsächlich auf den Linux-Entwicklungsrechnern die ksh als Standardshell eingesetzt. Ist wohl Nostalgik der Alt-Admins die sich nicht an neues gewöhnen wollen :D

  • Tut er auch, aber das ist hier völlig Nebensache.. :)

  • genau :)


    Zwei gut-gegrillte Steaks später und die shell-Welt ist irgendwie... so gleichgültig :)


    Allen Thread-Beteiligten noch einen schönen Sonntag... Jetzt noch einzwei kühle Bier und das Wochenende ist schon wieder rum...


    rael

  • Ich dachte das kommt erst nach dem Bier dazu.


    :prost2

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!