[gelöst] Zufallszahl in Shellskript

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
GregorS
Beiträge: 2589
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

[gelöst] Zufallszahl in Shellskript

Beitrag von GregorS » 08.06.2014 12:16:46

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
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])

thoerb
Beiträge: 1677
Registriert: 01.08.2012 15:34:53
Lizenz eigener Beiträge: MIT Lizenz

Re: Zufallszahl in Shellskript

Beitrag von thoerb » 08.06.2014 12:28:15

Code: Alles auswählen

answer=$(($RANDOM % 9+1 ))

Benutzeravatar
GregorS
Beiträge: 2589
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

Re: Zufallszahl in Shellskript

Beitrag von GregorS » 08.06.2014 12:34:54

thoerb hat geschrieben:

Code: Alles auswählen

answer=$(($RANDOM % 9+1 ))
Danke!

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])

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: [gelöst] Zufallszahl in Shellskript

Beitrag von Cae » 08.06.2014 16:54:04

Das ist mal wieder typisch. Da fragt jemand nach einem Shell-Skript und die Antwort ist in Bash-Syntax. Das ist nicht dasselbe!

Code: Alles auswählen

bash$ echo $RANDOM
23957
bash$ sh
$ echo $RANDOM

$ 
sh(1) hat kein $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
}
Es wird effektiv alles weggeschnitten, was keine Ziffer ist, und vom Rest das erste Zeichen genommen. Test:

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
$ 
Gruss Cae
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

Benutzeravatar
GregorS
Beiträge: 2589
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

Re: [gelöst] Zufallszahl in Shellskript

Beitrag von GregorS » 08.06.2014 16:58:59

Cae hat geschrieben:... Das ist nicht dasselbe! ...
Vielen Dank für diese Zusatzinfo!

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])

kuerbis
Beiträge: 20
Registriert: 29.03.2014 12:06:40

Re: [gelöst] Zufallszahl in Shellskript

Beitrag von kuerbis » 08.06.2014 17:30:58

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
}
Nein, denn die Option -c bei head ist eine GNU-Erweiterung und deshalb nicht mit anderen unix-artigen Systemen kompatibel. ;)
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)

Benutzeravatar
GregorS
Beiträge: 2589
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

Re: [gelöst] Zufallszahl in Shellskript

Beitrag von GregorS » 08.06.2014 17:54:07

kuerbis hat geschrieben: Anderer Lösungsvorschlag:

Code: Alles auswählen

tr -cd 0-9 </dev/urandom | dd bs=1 count=1 2>/dev/null
Da gibt es möglicherweise ein Problem: Die Ausgabe enthält kein Zeilenende-Zeichen.

Code: Alles auswählen

 ANS=`echo -en "\`tr -cd 0-9 < /dev/urandom | dd bs=1 count=1 2>/dev/null\`\\n"`; echo $ANS
Funktioniert aber bestens.

Gruß

Gregor
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])

kuerbis
Beiträge: 20
Registriert: 29.03.2014 12:06:40

Re: [gelöst] Zufallszahl in Shellskript

Beitrag von kuerbis » 08.06.2014 18:19:58

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:

Code: Alles auswählen

var=$(befehl1 "$(befehl2)")
statt

Code: Alles auswählen

var=`befehl1 "\`befehl2\`"`
Ein Zeilenende-Zeichen kann man auch komplett ohne Verschachtelungen hinzufügen, indem man einfach ein echo ohne Parameter anhängt:

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)

thoerb
Beiträge: 1677
Registriert: 01.08.2012 15:34:53
Lizenz eigener Beiträge: MIT Lizenz

Re: [gelöst] Zufallszahl in Shellskript

Beitrag von thoerb » 08.06.2014 18:37:42

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!
Oh, das muss ich wohl übersehen haben. :wink:

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.

Benutzeravatar
GregorS
Beiträge: 2589
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

Re: [gelöst] Zufallszahl in Shellskript

Beitrag von GregorS » 08.06.2014 22:32:04

kuerbis hat geschrieben:Wobei echo -e wiederum eine bash-Besonderheit ist. ...
Beispiel:

Code: Alles auswählen

var=$(befehl1 "$(befehl2)")
statt

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
Jo mei. Ich bin zwar älter als oldstable aber das will nix heißen.

Danke Euch!

Gregor
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])

wanne
Moderator
Beiträge: 7462
Registriert: 24.05.2010 12:39:42

Re: [gelöst] Zufallszahl in Shellskript

Beitrag von wanne » 09.06.2014 11:58:43

thoerb hat geschrieben:So weit mir bekannt ist, ist die Bash die Standard-Shell auf Linux-Systemen.
Das stimmt für die meisten Linux-Distributionen aber nicht für Debian da ist es die dash. (Die eben kein $RANDOM kennt. )
rot: Moderator wanne spricht, default: User wanne spricht.

Antworten