Nur eine Notiz über den binären Suchansatz. Mit "größer als" oder "kleiner als" können Sie überprüfen, ob der angegebene Name des Benutzers unterhalb oder oberhalb des aktuellen Namens im Array liegt, da die Namen in alphabetischer Reihenfolge stehen (dh die Person, die Ihnen diese Aufgabe erteilt hat) Bequemlichkeit).
Der Code:
# Store the names and grades into arrays
names=($(cut -d: -f1 filename))
grades=($(cut -d: -f2 filename))
# Prompt user for a name
echo "Type the student's name (use proper capitalization!), followed by [ENTER]:"
# Read the user's response
read name
length=${#names[@]}
start=0
end=$((length - 1))
match=0
while [[ $start -le $end ]]; do
middle_i=$((start + ((end - start)/2)))
middle_item=${names[$middle_i]}
if [[ $middle_item -gt $name ]]; then
end=$((end - middle_i-1))
elif [[ $middle_item -lt $name ]]; then
start=$((middle_i+1))
else
# A match was found
match=1
echo "${name}'s grade is a(n): ${grades[$middle_i]}."
break
fi
done
# Check if a match was found
if [[ $match = 0 ]]; then
echo "Couldn't find that student..."
fi
Wenn Sie ein gut lesbarer Ansatz sein nicht die binäre Suche finden, wie ich, dann würde ich empfehlen, ein for-Schleife:
# Find the user's provided name, print the
for i in "${!names[@]}"; do
# Check if the current name in the array is the same as the provided name
if [[ "${names[$i]}" = "${name}" ]]; then
# A match was found
match=1
echo "${name}'s grade is a(n): ${grades[$i]}."
break
fi
done
Für den cut
Befehl, wenn Sie nicht vertraut sind ...
-d
: gibt das Trennzeichen in der gegebenen Text verwendet Datei.
-f
: Gibt an, welches Feld beibehalten (und somit in das Array gespeichert werden soll).
Erklärung der Code:
- Sie der Textdatei denken, Sie können als CSV-Datei haben, mit Ausnahme von
:
statt ,
als Trennzeichen verwendet. Aus diesem Grund verwende ich -d:
. Es gibt zwei Spalten (d. H. Zwei Felder) pro Zeile in Ihrer Textdatei.
- Ein Feld entspricht im Wesentlichen einer Spalte in einer CSV-Datei. Die Felder sind durch das Trennzeichen
:
getrennt. Das erste Feld enthält den Namen des Schülers, also habe ich -f1
verwendet, um die Namen der Schüler zu erfassen. Das zweite Feld enthält die Note des Schülers, also habe ich -f2
verwendet, um die Noten der Schüler zu erfassen.
Fertig! Happy coding
'lesen -r my_var' kann lesen von stdin oder tty:' lesen -r my_var dev/tty' – andlrc
Ich habe noch nichts versucht. Ich bin total grün für Shell-Skripte. Ich werde versuchen, einige Dinge zwischen heute und morgen zu lesen. Jede Unterstützung wird hilfreich sein. –
@RobertoKippins Machen Sie sich mit den Manpages vertraut, zum Beispiel: 'man 1 read'. Die "1" kann normalerweise weggelassen werden, stellt aber sicher, dass Sie ausführbare Dateien finden. Für weitere Informationen siehe 'Mann Mann' :-). Eine weitere interessante Lektüre ist: http://mywiki.wooledge.org/Quotes und http://mywiki.wooledge.org/BashPitfalls Hab keine Angst davor, aber rater benutze es als Referenz, wann immer du es brauchst.Auch Shellcheck ist ein gutes Tool und eine gute Webseite um linting Shell Skripte zu erstellen. – andlrc