Gibt es die Möglichkeit in ein Bash Skript einen Zufallsgenerator einzubauen, der aus festgelegten Variablen eine Zufällige ausgibt?
Und zwar sitze ich momentan an einem Skript, das mir und meinen Kollegen sagen soll, wo wir in der Mittagspause essen gehen sollen. Mein Problem ist jetzt das ich nicht weiß wie ich aus den 4 Variablen = Ikea, Döner, Chinetzen (also Asiamann) oder Bäcker eine zufällige ausgeben lassen kann. Desweiteren hab ich einen Arbeitskollegen der kein Ikea mag und einen der keinen Döner mag. Aber das lässt sich doch problemlos über if und then lösen denke ich? Ich muss zugeben das ich da noch recht neu bin, Ausbildung und so.. :) Danke
5 Antworten
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
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
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!
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!
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
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
Oh auch ne gute idee, beispiel kann ich euch morgen geben :)
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
Okay das ist auch eine gute Idee, muss ich nur mal nachfragen ob das jeder hat
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
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ß, TuxgamerDanke das war eine sehr hilfreiche und freundlich geschriebene Antwort.
Danke erstmal :D so werd ichs morgen mal probieren, hab das skript leider nicht hier, nur auf arbeit.