Danke für die Hinweise.
Um das mehrmalige Abfragen mit read
zu verkürzen, habe ich oben das Skript choose von Vain eingebaut. Damit lassen sich die Felder nun zunächst auswählen, bis man mit "continue" zur Abfrage der Tabelle wechselt bzw. mit "quit" das Skript verlässt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #!/usr/bin/env bash _tabelle_1() { printf '#"Buch-ID";"Autor";"Verlag";"Verlagsjahr";"Titel";"Datum" "1";"Hans Vielschreiber";"Verlag";"2007";"Wir lernen SQL";"13.01.2007" "2";"J. Gutenberg";"Gutenberg und Co.";"1452";"Drucken leicht gemacht";"01.01.1452" "3";"G. I. Caesar";"Handschriftverlag";"-44";"Mein Leben mit Asterix";"16.03.-44" "4";"Galileo Galilei";"Inquisition International";"1640";"Eppur si muove";"1641" "6";"Charles Darwin";"Vatikan-Verlag";"1860";"Adam und Eva";"1862" ' } _maske_1() { declare -A felder declare -A navigation navigation[continue]='continue=continue' navigation[quit]='quit=quit' felder[Buch-ID]='read -re -p "Buch-ID: " i' felder[Autor]='read -re -p "Autor: " a' felder[Verlag]='read -re -p "Verlag: " v' felder[Verlagsjahr]='read -re -p "Verlagsjahr: " vj' felder[Titel]='read -re -p "Titel: " t' felder[Datum]='read -re -p "Datum: " d' while : do while [[ ! $continue ]] do selection=$( { printf '%s\n' "${!navigation[@]}" " " ; printf '%s\n' "${!felder[@]}" | sort ; } | choose - ) if [[ "${felder[$selection]}" ]] then eval "${felder[$selection]}" else eval "${navigation[$selection]}" fi [[ $quit ]] && exit done clear while IFS=';' read -r i a v vj t d do printf '%s\n' "Buch-ID: ${i//\"/}" "Autor: ${a//\"/}" "Verlag: ${v//\"/}" "Verlagsjahr: ${vj//\"/}" "Titel: ${t//\"/}" "Datum: ${d//\"/}" echo done < <(egrep -e "^\"${i:-.*}\";\"${a:-.*}\";\"${v:-.*}\";\"${vj:-.*}\";\"${t:-.*}\";\"${d:-.*}\"$" <(_tabelle_1)) | less unset -v continue selection i a v vj t d done } PS3="Type a number or 'q' to quit: " select msk in $(typeset -F | sed -e 's/.* //') do [[ $msk ]] && { clear ; "$msk" ; } break done |
–
Edit:
Ich bastel hier weiter herum.