[gelöst] Zufallszahl in Shellskript
[gelöst] Zufallszahl in Shellskript
Moinmoin allerseits!
Ich möchte in einem Shellskript eine Zufallszahl (z. B. im Bereich von 1-3) erzeugen. Ich habe schon mit dd, grep und tr gespielt, komme aber nicht da an, wo ich hinwill. Wie muss der Befehl oder die Befehlsfolge aussehen, um beispielsweise der Variablen ANSWER eine der Zahlen von 0-9 zuzuweisen?
Sonntagsgruß
Gregor
Ich möchte in einem Shellskript eine Zufallszahl (z. B. im Bereich von 1-3) erzeugen. Ich habe schon mit dd, grep und tr gespielt, komme aber nicht da an, wo ich hinwill. Wie muss der Befehl oder die Befehlsfolge aussehen, um beispielsweise der Variablen ANSWER eine der Zahlen von 0-9 zuzuweisen?
Sonntagsgruß
Gregor
Zuletzt geändert von GregorS am 08.06.2014 12:35:11, insgesamt 1-mal geändert.
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])
Re: Zufallszahl in Shellskript
Code: Alles auswählen
answer=$(($RANDOM % 9+1 ))
Re: Zufallszahl in Shellskript
Danke!thoerb hat geschrieben:Code: Alles auswählen
answer=$(($RANDOM % 9+1 ))
Schönen Pfingstrest wünscht
Gregor
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])
Re: [gelöst] Zufallszahl in Shellskript
Das ist mal wieder typisch. Da fragt jemand nach einem Shell-Skript und die Antwort ist in Bash-Syntax. Das ist nicht dasselbe!sh(1) hat kein $RANDOM.
Auf unixoiden Systemen mit /dev/urandom sieht die korrekte Loesung fuer eine Shell zum Beispiel so aus:Es wird effektiv alles weggeschnitten, was keine Ziffer ist, und vom Rest das erste Zeichen genommen. Test:
Gruss Cae
Code: Alles auswählen
bash$ echo $RANDOM
23957
bash$ sh
$ echo $RANDOM
$
Auf unixoiden Systemen mit /dev/urandom sieht die korrekte Loesung fuer eine Shell zum Beispiel so aus:
Code: Alles auswählen
random_digit() {
tr -cd 0-9 </dev/urandom | head -c 1
}
Code: Alles auswählen
$ for i in $(seq 20); do random_digit; echo; done | xargs
2 0 0 9 8 8 6 9 9 3 4 2 6 7 9 0 8 9 7 0
$
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.
—Bruce Schneier
Re: [gelöst] Zufallszahl in Shellskript
Vielen Dank für diese Zusatzinfo!Cae hat geschrieben:... Das ist nicht dasselbe! ...
Meistens versuche ich ja, sowas selbst herauszubekommen, aber wegen solcher Informationen finde ich es manchmal trotzdem nett, Leuten mit meinen Fragen auf den Sack (pardon, is ja Sonntag) zu gehen.
Gruß
Gregor
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])
Re: [gelöst] Zufallszahl in Shellskript
Nein, denn die Option -c bei head ist eine GNU-Erweiterung und deshalb nicht mit anderen unix-artigen Systemen kompatibel.Cae hat geschrieben:Auf unixoiden Systemen mit /dev/urandom sieht die korrekte Loesung fuer eine Shell zum Beispiel so aus:Code: Alles auswählen
random_digit() { tr -cd 0-9 </dev/urandom | head -c 1 }
Anderer Lösungsvorschlag:
Code: Alles auswählen
tr -cd 0-9 </dev/urandom | dd bs=1 count=1 2>/dev/null
"There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies." (C.A.R. Hoare)
Re: [gelöst] Zufallszahl in Shellskript
Da gibt es möglicherweise ein Problem: Die Ausgabe enthält kein Zeilenende-Zeichen.kuerbis hat geschrieben: Anderer Lösungsvorschlag:Code: Alles auswählen
tr -cd 0-9 </dev/urandom | dd bs=1 count=1 2>/dev/null
Code: Alles auswählen
ANS=`echo -en "\`tr -cd 0-9 < /dev/urandom | dd bs=1 count=1 2>/dev/null\`\\n"`; echo $ANS
Gruß
Gregor
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])
Re: [gelöst] Zufallszahl in Shellskript
Wobei echo -e wiederum eine bash-Besonderheit ist. Andere Varianten (z.B. in dash oder pdksh) werten Escape-Sequenzen auch ohne -e aus.
Statt Backticks ("`") würde ich übrigens Klammern verwenden ("$()"). Damit lassen sich Befehle einfacher und lesbarer verschachteln.
Beispiel: statt
Ein Zeilenende-Zeichen kann man auch komplett ohne Verschachtelungen hinzufügen, indem man einfach ein echo ohne Parameter anhängt:
Statt Backticks ("`") würde ich übrigens Klammern verwenden ("$()"). Damit lassen sich Befehle einfacher und lesbarer verschachteln.
Beispiel:
Code: Alles auswählen
var=$(befehl1 "$(befehl2)")
Code: Alles auswählen
var=`befehl1 "\`befehl2\`"`
Code: Alles auswählen
tr -cd 0-9 </dev/urandom | dd bs=1 count=1 2>/dev/null; echo
"There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies." (C.A.R. Hoare)
Re: [gelöst] Zufallszahl in Shellskript
Oh, das muss ich wohl übersehen haben.Cae hat geschrieben:Das ist mal wieder typisch. Da fragt jemand nach einem Shell-Skript und die Antwort ist in Bash-Syntax. Das ist nicht dasselbe!
So weit mir bekannt ist, ist die Bash die Standard-Shell auf Linux-Systemen. Deswegen habe ich mir da ehrlich gesagt, keine Gedanken darüber gemacht. Aber dein Hinweis hat durchaus seine Berechtigung.
Vielen Dank, hier lernt man immer was dazu.
Re: [gelöst] Zufallszahl in Shellskript
Jo mei. Ich bin zwar älter als oldstable aber das will nix heißen.kuerbis hat geschrieben:Wobei echo -e wiederum eine bash-Besonderheit ist. ...
Beispiel:stattCode: Alles auswählen
var=$(befehl1 "$(befehl2)")
...Code: Alles auswählen
var=`befehl1 "\`befehl2\`"`
Code: Alles auswählen
tr -cd 0-9 </dev/urandom | dd bs=1 count=1 2>/dev/null; echo
Danke Euch!
Gregor
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])
Re: [gelöst] Zufallszahl in Shellskript
Das stimmt für die meisten Linux-Distributionen aber nicht für Debian da ist es die dash. (Die eben kein $RANDOM kennt. )thoerb hat geschrieben:So weit mir bekannt ist, ist die Bash die Standard-Shell auf Linux-Systemen.
rot: Moderator wanne spricht, default: User wanne spricht.