deXXteR275
Anmeldungsdatum: 7. Juni 2013
Beiträge: Zähle...
Wohnort: Bad Hersfeld
|
Hallo zusammen. Ich möchte gerne ein Shell Skript haben, womit sich das Suchen von Datenbankinhalten vereinfachen lässt. Dazu brauche ich eine Maske wo ich meine Daten eingebe und mich dort mit den Pfeiltasten bewege und nach Betätigen der Enter Taste werden dann die eingegebenen Werte genommen und danach gesucht. Es ist schwer zu erklären. So soll die Maske aussehen: Zuerst Tabelle abfragen Tabelle eingeben: tb_kunde Dann soll sich die Maske öffnen die zum Beispiel so aussieht: Vorname:[ ] Nachname:[ ] Kundennummer:[ ] Straße:[ ] Ort:[ ] .......... Vorname Nachname usw. sind die Feldernamen die sich dort automatisch hinschreiben.
jetzt möchte ich mich per Pfeiltasten durch die eckigen Klammern bewegen und dort werte eintragen können. beispiel Tabelle eingeben: tb_kunde Vorname:[ ] Nachname:[Müller ] Kundennummer:[123* ] Straße:[ ] Ort:[ ] dann enter und dann sucht er nach der kundenummer die mit 123 beginnen und wo der nachname Müller ist und zeigt mir die einträge.
momentan läuft das in einer schleife wo ich die abfragen nacheinander mache und per read -p dann in ein array speicher. ich hoffe ihr versteht was ich meine und könnt mir helfen.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
Du müsstest ein Tool mit Unterstüzung für NCurses nutzen, wenn Du das auf der Shell machen willst. Aber vielleicht wäre LibreOffice Base auch etwas, da kann man Verbindungen zu externen Datenbanken herstellen und Masken definieren.
|
deXXteR275
(Themenstarter)
Anmeldungsdatum: 7. Juni 2013
Beiträge: 46
Wohnort: Bad Hersfeld
|
hm okay. ne ziel sollte schon sein dies in einem shell skript zu schreiben ohne hilfe von einem anderem programm. wenn ich jetzt kein tool oder ähnliches drauf habe und auch keins haben will, geht das dann überhaupt?
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
deXXteR275 schrieb: momentan läuft das in einer schleife wo ich die abfragen nacheinander mache und per read -p dann in ein array speicher.
So wie es Dir vorschwebt, ist das aber auch nicht anders ! - da ist lediglich die Optik anders, dass das ganze Formular geschrieben wird, nur dass danach der Cursor jeweils an die gewünschte Stelle weiter oben gesetzt wird**. Das Formular wird dabei auch nur auf dem Bildschirm simuliert. track ** → guck Dir mal die ANSI-Codes an !
|
deXXteR275
(Themenstarter)
Anmeldungsdatum: 7. Juni 2013
Beiträge: 46
Wohnort: Bad Hersfeld
|
ah ok. und wie mach ich diese optik sodass ich mit dem cursor durch die reihen wechseln kann?
|
deXXteR275
(Themenstarter)
Anmeldungsdatum: 7. Juni 2013
Beiträge: 46
Wohnort: Bad Hersfeld
|
momentan sieht das ungefähr so aus. Pro Schleifendurchgang eine read-Abfrage.. | array=('Vorname' 'Nachname' 'Kundennummer' 'Ort')
q=0
for x in ${array[*]}
do
read -p "Wert für $x angeben: " wert[q]
((q=$q+1))
done
|
würde aber gerne alle aufeinmal aufzeigen und dann die werte eintragen und mit pfeiltaste nach unten ins nächste wechseln.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
deXXteR275 schrieb: hm okay. ne ziel sollte schon sein dies in einem shell skript zu schreiben ohne hilfe von einem anderem programm.
Du kannst immerhin tput nutzen, um den Cursor zu positionieren etc.
wenn ich jetzt kein tool oder ähnliches drauf habe und auch keins haben will, geht das dann überhaupt?
Dann musst Du alle Escape-Sequenzen zur Cursor-Positionierung, sowie die Eingabebehandlung selbst schreiben. PS: Ich habe beim Suchen noch dialog entdeckt. Das scheint ungefähr das zu sein, was Du suchst.
|
deXXteR275
(Themenstarter)
Anmeldungsdatum: 7. Juni 2013
Beiträge: 46
Wohnort: Bad Hersfeld
|
hmm stimmt diaglog wäre noch eine möglichkeit habe ich gerade gar nicht dran gedacht. danke dir dafür an die anderen sachen von wegen was selbst schreiben trau ich mich nicht ran 😀
|
D630
Anmeldungsdatum: 24. Juli 2013
Beiträge: 329
|
Sowas habe ich auch schon immer gesucht und selbst nie hinbekommen! Deswegen helfe ich mir stattdessen meist mit Schleifen/Auswahlmenüs (und muss auf das Feldwechseln verzichten). Nach diesem Motto etwa: 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 | #!/usr/bin/env bash
_data()
{
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"
'
}
_tabelle_1()
{
while :
do
read -re -p "Buch-ID: " i
read -re -p "Autor: " a
read -re -p "Verlag: " v
read -re -p "Verlagsjahr: " vj
read -re -p "Titel: " t
read -re -p "Datum: " d
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:-.*}\"$" <(_data)) | less
done
}
PS3="Type a number or 'q' to quit: "
select tbl in $(typeset -F | sed -e 's/.* //')
do
[[ $tbl ]] && { clear ; "$tbl" ; }
break
done
|
rklm schrieb: Dann musst Du alle Escape-Sequenzen zur Cursor-Positionierung, sowie die Eingabebehandlung selbst schreiben.
Wenn das mal jemand exemplarisch zeigen könnte, wäre ich sehr dankbar! ☺
|
deXXteR275
(Themenstarter)
Anmeldungsdatum: 7. Juni 2013
Beiträge: 46
Wohnort: Bad Hersfeld
|
wobei mit dialog zu arbeiten auch schwierig ist weil ich ca 20 verschieden tabellen habe mit immer unterschiedlichen feldernamen und ich die ausgabe in der dialogbox variable gestalten müsste und da nicht weiß wie das funktioniert... sprich einmal hat man nur 10 felder einmal 12 und wieder bei einer anderen tabelle gibt es 25 felder.
|
deXXteR275
(Themenstarter)
Anmeldungsdatum: 7. Juni 2013
Beiträge: 46
Wohnort: Bad Hersfeld
|
D630 schrieb: Sowas habe ich auch schon immer gesucht und selbst nie hinbekommen! Deswegen helfe ich mir stattdessen meist mit Schleifen/Auswahlmenüs (und muss auf das Feldwechseln verzichten). Nach diesem Motto etwa: 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 | #!/usr/bin/env bash
_data()
{
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"
'
}
_tabelle_1()
{
while :
do
read -re -p "Buch-ID: " i
read -re -p "Autor: " a
read -re -p "Verlag: " v
read -re -p "Verlagsjahr: " vj
read -re -p "Titel: " t
read -re -p "Datum: " d
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:-.*}\"$" <(_data)) | less
done
}
PS3="Type a number or 'q' to quit: "
select tbl in $(typeset -F | sed -e 's/.* //')
do
[[ $tbl ]] && { clear ; "$tbl" ; }
break
done
|
rklm schrieb: Dann musst Du alle Escape-Sequenzen zur Cursor-Positionierung, sowie die Eingabebehandlung selbst schreiben.
Wenn das mal jemand exemplarisch zeigen könnte, wäre ich sehr dankbar! ☺
versteh ich nicht ☹ also deinen quellcode. Bei mir gibt er einfach nur den ganzen text aus sonst passiert nichts 😀 edit sorry vergiss es ich hätte mal runter scrollen sollen ._.
|
D630
Anmeldungsdatum: 24. Juli 2013
Beiträge: 329
|
deXXteR275 schrieb:
versteh ich nicht ☹ also deinen quellcode. Bei mir gibt er einfach nur den ganzen text aus sonst passiert nichts 😀 edit sorry vergiss es ich hätte mal runter scrollen sollen ._.
Jede gebastelte Maske wäre eine eigene Funktion, die du auswählst. Die Felder (können leer sein) werden in greps Suchmuster eingesetzt; der Match wird nach less gepipt. Problem ist dabei, dass du jedes Feld mit Enter bestätigen musst, was bei 25 Feldern natürlich gar nicht sinnvoll ist. Vor allem dann, wenn du ja nur ein Feld für eine Suche eingeben willst. Die Daten aus der Funktion _data() würde man eigentlich aus einer Datei einlesen.
|
g00d.morning
Anmeldungsdatum: 20. Februar 2013
Beiträge: 330
|
Hi! Mal ein wenig anders gefragt: Wozu dient das Ganze? Meint, ist das nur eine Spielerei oder soll das in einer Firma o.ä. laufen? Vielleicht ginge ja auch ein CGI-Skript (könnte ja sogar bash oder shell sein 😉), dass alles in einer lokalen Webseite läuft. So wäre das auch prima von verschiedenen Arbeitsplätzen bedienbar. Beste Grüße.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
D630 schrieb:
rklm schrieb: Dann musst Du alle Escape-Sequenzen zur Cursor-Positionierung, sowie die Eingabebehandlung selbst schreiben.
Wenn das mal jemand exemplarisch zeigen könnte, wäre ich sehr dankbar! ☺
$ echo $'non bold\x1b\x5b\x31\x6dbold'
non boldbold (Musst Du natürlich in Deinem Terminal ausführen, aber keine Garantie, dass es klappt.) Das ist m.E. keine gute Idee. Du solltest wenigstens tput dafür nehmen, das Dir die Anpassung an das aktuelle Terminal abnimmt. Das habe ich auch benutzt, um die Hex-Sequenz zu ermitteln: $ tput bold true | od -t x1
0000000 1b 5b 31 6d
0000004 Ciao robert
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
D630 schrieb: rklm schrieb: Dann musst Du alle Escape-Sequenzen zur Cursor-Positionierung, sowie die Eingabebehandlung selbst schreiben.
Wenn das mal jemand exemplarisch zeigen könnte, wäre ich sehr dankbar! ☺
Guck doch mal hier, ein Beispiel-Skript, wo ich sowas mal gemacht habe. deXXteR275 schrieb: ... an die anderen sachen von wegen was selbst schreiben trau ich mich nicht ran 😀
Guck Dir mein dort verlinktes Skript einfach mal an. Bei einer einzigen Zeile kann man mit einem einfachen Cursor- Rücklauf ("\r") die Zeile überschreiben: echo -en "\rCountdown: [$sec]sec bitte einstellen: [+][-] und bestätigen: [Enter]" Bei mehreren Zeilen kommt statt dessen eine Reihe move-Cursor-Befehle wie echo -e "\e[4A" usw. zum Einsatz. (Ja, das ist etwas Fleißarbeit, aber so ist es nun mal, wenn Du diesen Luxus mit Hand bauen willst) Oder Du machst es wie hier in einem früheren Skript, wo ich mit "Cursor zwischenspeichern" (echo "\e[s" / echo "\e[u" ) den Cursor immer wieder auf einen definierten Punkt nach oben setze und von dort an alles neu schreibe. (→ das klappt nur, wenn das Terminalfenster größer ist als das Menü. Sonst muss man das Terminal scrollen lassen !) LG, track
|