burn3r
Anmeldungsdatum: 2. November 2009
Beiträge: 40
|
Servus, ich soll ein Bash Shell Script schreiben, welches mir die größte Zahl raussucht. Beispiel: bash script 42 12 3 4
Ausgabe: 42 Ich komme einfach nicht dahinter, wie das funktioniert, ich habe erstes das Problem, das mir dieser "test" zahl -gt zahl keinerlei Werte ausspuckt, zweites, wäre es möglich das ich auch mehrere parameter eingeben kann, also z.b 10 Zahlen, dass es da dann immernoch funktioniert. Wäre für jede kleine Hilfe sehr dankbar.
|
Lunar
Anmeldungsdatum: 17. März 2006
Beiträge: 5792
|
burn3r, man wird Dir hier nicht Deine Hausaufgaben lösen, sondern nur bei konkreten Fehlern helfen, also zeige den Quelltext, den Du bis jetzt hast, und beschreibe konkrete Probleme.
|
Sid_Burn
Anmeldungsdatum: 23. Oktober 2004
Beiträge: 2159
|
Bei der Abfrage "zahl1 -gt zahl2" kommt ein Status "Wahr" oder "Unwahr" zurück. Wenn es Wahr ist ist "zahl1" größer zahl2, ansonsten ist "zahl2" größer "zahl1".
Ansonsten wäre ein Lösungsweg wenn du die erste Zahl als Initialwert nimmst als größte Zahl. Danach itterierst du durch die restlichen Zahlen und prüfst ob die neue Zahl größer als deine gespeicherte Zahl ist, wenn dies der fall ist speicherst du deine neue Zahl. Als Pseudocode sehe das so aus. $ZAHLEN = [ 42, 12, 3, 4 ]
$MAX_ZAHL = $ZAHLEN[0]
JEDE $ZAHL IN $ZAHLEN[1] BIS $ZAHLEN[3] {
WENN $ZAHL GRößER $MAX_ZAHL {
$MAX_ZAHL = $ZAHL
}
}
AUSGEBEN $MAX_ZAHL
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
Oha... wieso das denn? Imho ist die Bash nicht wirklich für numerische Probleme geeignet! Na gut, hier mal meine Lösung: Edit: Wegen Hausaufgabenhinweis gelöscht!
|
burn3r
(Themenstarter)
Anmeldungsdatum: 2. November 2009
Beiträge: 40
|
@Mod, ich habe nichts davon erwähnt, dass ich ein fertiges Shell Script haben möchte, sondern nur um hilfe gebeten, da ich schonmal daran scheitere, ohne $Zahl speichern, dass in der Console die größere Zahl wieder gegeben wird. Aber durch die Erklärung mit dem Pseudocode komm ich etwas weiter. Danke
|
pinguino
Anmeldungsdatum: 6. Februar 2007
Beiträge: 732
Wohnort: BW
|
du könntest das so lösen: | #!/bin/bash
var=` echo -e "$1\n $2\n $3\n $4" | sort -nr`
echo "$var" > a1
read var1 < a1
echo "$var1"
|
|
burn3r
(Themenstarter)
Anmeldungsdatum: 2. November 2009
Beiträge: 40
|
Nun, ich versuche es mit variablen etc, wie es im Script bei uns vorhanden ist. Ich habe nun das Problem, dass ich über die Kommadozeile paramter mitgeben möchte mal 4, mal 5 usw. Wie kann ich meine Eingabe "zerstückeln"? #!/bin/bash
for $ZAHLEN in $*
....
if [ $z1 -gt $z2 ]
then
echo "$z1 ist größer als $z2"
else
echo "z1 ist kleiner als $z2"
fi
echo "" Mich würde interessieren, wie ich es hinkriegne könnte, dass $ZAHLEN in $z1, $z2 usw umgewandelt werden können.
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
Das $* ist entscheidend.
1
2
3
4
5
6
7
8
9
10
11
12
13 | #!/usr/bin/env bash
# Maximum initialisieren
max=$1
# über alle Parameter iterieren
for zahl in $*; do
# neues Element >= bisheriges Maximum?
if [ $zahl -ge $max ]; then
# ist größer, also neues Maximum gefunden
max=$zahl
fi
done;
echo $max
|
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17621
Wohnort: Berlin
|
Mit Arrays kann man schön eine rekursive Lösung produzieren, die auf einem Multicore vielleicht schneller ausgeführt werden könnte:
#!/bin/bash
#
# Das Maximum von 1-n Elementen bestimmen
#
function max ()
{
case $# in
1) echo $1
;;
2) (( $1 >= $2 )) && echo $1 || echo $2
;;
*) ar=($*)
len=$#
mid=$((len/2))
max $(max ${ar[*]:0:$mid}) $(max ${ar[*]:$mid})
;;
esac
}
max 4
max 6 8
max 3 7 5
max 3 5 9 17
max 3 5 9 88 4 654 3 23 319 99 66 44 33 23 34 434 343 91 81 1271 17
Ist die Arraylänge 1, so ist das Array das Maximum.
Ist sie 2, dann das 1. Element, wenn es größer ist, sonst das zweite.
Ist sie größer, dann das Maximum des Maximums der vorderen und des Maximums der hinteren Hälfte des Arrays.
|
Lunar
Anmeldungsdatum: 17. März 2006
Beiträge: 5792
|
In diesem Fall ist es egal, weil Zahlen keine Leerzeichen enthalten, allgemein aber gilt, dass "$@" statt $* zu nutzen ist. $@ repräsentiert die übergebenen Argumente, $* dagegen die übergebenen Worte. Der Unterschied lässt sich mit folgendem Skript demonstrieren:
| for foo in $*; do echo "$foo"; done
echo "---"
for foo in "$@"; do echo "$foo"; done
|
$ bash /tmp/test.sh "1 2" 3
1
2
3
---
1 2
3 Die if-Abfrage müsste sich übrigens auch durch einen bedingten Ausdruck kürzen lassen:
| [[ $zahl -ge $max ]] && max=$zahl
|
|