Gibt es die Möglichkeit in ein Bash Skript einen Zufallsgenerator einzubauen, der aus festgelegten Variablen eine Zufällige ausgibt?

5 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Hallo

Gibt es die Möglichkeit in ein Bash Skript einen Zufallsgenerator einzubauen, der aus festgelegten Variablen eine Zufällige ausgibt?

Ja, das geht am Einfachsten mit einer Datei, nennen wir sie mittagessen und dem Beispielinhalt folgendermaßen befüllt:

Ikea
Döner
Asia
Bäcker
Fisch
Fleisch

Dann einfach so eine zufällige Zeile auswählen:

cat mittagessen|sort --random-sort | head -n 1

Die Einschränkungen musst Du dann nur mit einer if-Anweisung eingrenzen.

Linuxhase

Woher ich das weiß:eigene Erfahrung – Ich benutze seit 2007 Linux und habe LPIC101 und LPIC102

Justinzockt99 
Fragesteller
 11.10.2017, 09:48

Das war ne gute Idee Danke!

1

Zufallsgenerator

In bash kannst einfach $RANDOM nehmen - jedes mal, wenn du die Variable ließt steht da neuer Wert drinnen.

Willst Zahlen von 0-3 (da nur 4 Auswahlmöglichkeiten), nimmst den modulo-Trick (also Zufallszahl modulo 4 nehmen) - bestimmt schon mal gesehen.

Bash und Mathe - meiner Meinung nach am schönsten - die doppelten (( )). Also

$(($RANDOM%4))

liefert dir deine Zufallszahl von 0 bis 3.

Desweiteren hab ich einen Arbeitskollegen der kein Ikea mag und einen der keinen Döner mag.

Das machts interessant. Am schönsten wahrscheinlich, wenn du eine funktion schreibst und mit Arrays arbeitest.

http://tldp.org/LDP/abs/html/functions.html

http://tldp.org/LDP/abs/html/arrays.html

Also:

Erstellst Array "Ikea, Döner, Asiamann, Bäcker" und einen zweiten "Asiamann, Bäcker".

Dann implementierst eine bash-funktion: "returnRandomElementOfArray" - und rufst die entweder mit Array1 oder Array2 auf.

Und da will ich dir jetzt nicht den ganzen Spaß nehmen ;). Kannst dich ja melden, wenn du irgendwo nicht weiterkommst.

Gruß, Tuxgamer


Justinzockt99 
Fragesteller
 10.10.2017, 20:12

Danke erstmal :D so werd ichs morgen mal probieren, hab das skript leider nicht hier, nur auf arbeit. 

1
iMPerFekTioN  11.10.2017, 11:33
@Justinzockt99

Du brauchst aber mindestens 4 Arrays!

Warum?

Nehmen wir an wir haben 3 Mitarbeiter: Hans, Peter und Michael

Peter mag alles, Michael kein Ikea und Hans kein Döner!

Wenn Hans alleine geht, gibt es zu Auswahl:
Chinese, Bäcker, Ikea

Wenn Michael alleine geht:
Chinese, Bäcker, Döner

Wenn Peter alleine geht:
Döner, Ikea, Chinese, Bäcker

Wenn alle gehen:
Bäcker, Chinese!

1

Okay also ich habs jetzt so gemacht wie Linuxhase meinte, war für das was ich machen wollte am schnellsten :D Aber Das "Ok" wird nicht ausgegeben, nicht schlimm eigentlich, weil da sollte am besten eh nix stehen. Aber wundert mich doch etwas. Und gibt es eine Möglichkeit das dort bei der if Antwort "Nein" einfach nix passiert? und er mir einfach die nächste Frage stellt?

#!/bin/sh
# - Mittagsort Chooser 1.1 -

#Mögliche Orte
#a=Ikea
#b=Döner
#c=Schinetze
#d=Bäcker

#Datei erstellen

touch Mittagsorte.txt
echo Ikea > Mittagsorte.txt
echo Döner >> Mittagsorte.txt
echo Schinetze >> Mittagsorte.txt
echo Bäcker >> Mittagsorte.txt

#Abfragen

read -p"Ist Peter da (Ja/Nein) ?" Antwort1
if [ $Antwort1 == "Ja" ]; then
sed -i '/^Ikea/d' Mittagsorte.txt

if [ $Antwort1 == "Nein" ]; then
echo "Ok"

fi
fi

read -p"Ist Karl da (Ja/Nein) ?" Antwort2
if [ $Antwort2 == "Ja" ]; then
sed -i '/^Döner/d' Mittagsorte.txt

if [ $Antwort2 == "Nein" ]; then
echo "Ok"

fi
fi

#Zufall

cat Mittagsorte.txt|sort --random-sort | head -n 1
rm Mittagsorte.txt

Die Namen sind nicht so wichtig und die Fragen auch, da werde ich nochmal beim Ausbilder nachfragen :D, ging mir ums Prinzip. Danke Leute!


iMPerFekTioN  11.10.2017, 11:37

Arbeite doch mit elif statt einer neuen if!

Wird übersichtlicher und ist einfacher!

Wenn du willst das bei "Nein" nichts passiert, dann ändere von

if [ $Antwort1 == "Nein" ]; then 
echo "Ok"

fi

zu

if [ $Antwort1 == "Nein" ]; then 


fi

Wenn du möchtest dass die nächste Abfrage bei einem "Nein" kommt, musst du diese als Bedingung angeben:

if [ $Antwort1 == "Nein" ]; then 
if [ nächste Abfrage usw. ] then

fi
fi

Grüße,


iMPerFekTioN

0

Hast du kein Beispiel parat das wir sehen, wie weit du denn überhaupt bist?=)

Du kannst auch Zahlen zwischen 1 und 5 generieren lassen (RANDOM) und diese Zahlen den Variablen zuweisen

1=Döner
2=IKEA
3=...

und dadurch dann alles wählen lassen.

Wäre eigentlich schon die Lösung deines 1. Problems ;)

Das 2. Problem, dass jemand etwas nicht mag, müsstest du wohl mit einbeziehen, in dem du auswählen musst welche Mitarbeiter denn anwesend sind.

Per Checkliste etc. kannst du ja alle an hacken und sagen:

if [ "$checkliste" = "Mitarbeiter" ]; then

Döner, Pizza,....

else

Döner, IKEA, Pizza

fi

Grüße,

iMPerFekTioN


Justinzockt99 
Fragesteller
 10.10.2017, 20:14

Oh auch ne gute idee, beispiel kann ich euch morgen geben :)

1
iMPerFekTioN  11.10.2017, 11:30
@Justinzockt99

Versuchs mal so..

Voraussetzung: kdialog ist installiert!

#!/bin/bash
auswahl=$( kdialog --checklist "Wähle die Mitarbeiter aus" rudi "Rudi" off bernd "Bernd" off melle "Melissa" off)
echo $auswahl | sed s/\"//g

if [[ "$auswahl" == *"rudi"* ]] && [[ "$auswahl" == *"melle"* ]] && [[ "$auswahl" == *"bernd"* ]]; then
echo "no"
array[0]="Bäcker"
array[1]="Chinetzen"
array[2]="Döner"
array[3]="Ikea"

size=${#array[@]}
index=$(($RANDOM % $size))
echo ${array[$index]}

elif [[ "$auswahl" == *"rudi"* ]] && [[ "$auswahl" == *"melle"* ]]; then
echo "yes3"
array[0]="Bäcker"
array[1]="Chinetzen"

size=${#array[@]}
index=$(($RANDOM % $size))
echo ${array[$index]}

elif [[ "$auswahl" == *"rudi"* ]]; then
echo "yes2"
array[0]="Bäcker"
array[1]="Chinetzen"
array[2]="Döner"

size=${#array[@]}
index=$(($RANDOM % $size))
echo ${array[$index]}

elif [[ "$auswahl" == *"melle"* ]] ; then
echo "yes1"
array[0]="Bäcker"
array[1]="Chinetzen"
array[2]="Ikea"

size=${#array[@]}
index=$(($RANDOM % $size))
echo ${array[$index]}

fi
1
Justinzockt99 
Fragesteller
 11.10.2017, 12:20
@iMPerFekTioN

Okay das ist auch eine gute Idee, muss ich nur mal nachfragen ob das jeder hat

1
iMPerFekTioN  11.10.2017, 12:25
@Justinzockt99

FALLS du Linux benutzt, kannst du das mit

sudo apt-get install kdialog

installieren!

Sonst kannst du das auch so, ohne Dialog abfragen, hier ist jetzt aber wichtig das die Namen korrekt geschrieben werden!:

#!/bin/bash

echo "Bitte gib die Namen der Mitarbeiter ein, die heute mit zum Essen kommen wollen!"
read auswahl


if [[ "$auswahl" == *"rudi"* ]] && [[ "$auswahl" == *"melle"* ]] && [[ "$auswahl" == *"bernd"* ]]; then
echo "no"
array[0]="Bäcker"
array[1]="Chinetzen"
array[2]="Döner"
array[3]="Ikea"

size=${#array[@]}
index=$(($RANDOM % $size))
echo ${array[$index]}

elif [[ "$auswahl" == *"rudi"* ]] && [[ "$auswahl" == *"melle"* ]]; then
echo "yes3"
array[0]="Bäcker"
array[1]="Chinetzen"

size=${#array[@]}
index=$(($RANDOM % $size))
echo ${array[$index]}

elif [[ "$auswahl" == *"rudi"* ]]; then
echo "yes2"
array[0]="Bäcker"
array[1]="Chinetzen"
array[2]="Döner"

size=${#array[@]}
index=$(($RANDOM % $size))
echo ${array[$index]}

elif [[ "$auswahl" == *"melle"* ]] ; then
echo "yes1"
array[0]="Bäcker"
array[1]="Chinetzen"
array[2]="Ikea"

size=${#array[@]}
index=$(($RANDOM % $size))
echo ${array[$index]}

fi
0

In bash kannst einfach $RANDOM nehmen - jedes mal, wenn du die Variable ließt steht da neuer Wert drinnen.

Willst Zahlen von 0-3 (da nur 4 Auswahlmöglichkeiten), nimmst den modulo-Trick (also Zufallszahl modulo 4 nehmen) - bestimmt schon mal gesehen.

Bash und Mathe - meiner Meinung nach am schönsten - die doppelten (( )). Also

$(($RANDOM%4))

liefert dir deine Zufallszahl von 0 bis 3.

Desweiteren hab ich einen Arbeitskollegen der kein Ikea mag und einen der keinen Döner mag.

Das machts interessant. Am schönsten wahrscheinlich, wenn du eine funktion schreibst und mit Arrays arbeitest.

http://tldp.org/LDP/abs/html/functions.html

http://tldp.org/LDP/abs/html/arrays.html

Also:

Erstellst Array "Ikea, Döner, Asiamann, Bäcker" und einen zweiten "Asiamann, Bäcker".

Dann implementierst eine bash-funktion: "returnRandomElementOfArray" - und rufst die entweder mit Array1 oder Array2 auf.

Und da will ich dir jetzt nicht den ganzen Spaß nehmen ;). Kannst dich ja melden, wenn du irgendwo nicht weiterkommst.

Gruß, Tuxgamer

Justinzockt99 
Fragesteller
 18.01.2021, 17:14

Danke das war eine sehr hilfreiche und freundlich geschriebene Antwort.

0