Rhaban
Anmeldungsdatum: 25. Juni 2016
Beiträge: 469
Wohnort: München
|
Hallo, ich bin seit gestern mit folgendem ― merkwürdigen ― Problem konfrontiert und bitte um Hilfe: Schon seit einigen Wochen verwende ich ein selbst verfasstes Shellscript, mit dem ich vor allem Blutzuckerwerte (Ich bin Typ-1-Diabetiker), aber auch andere Dinge verwalte. Dieses Shellscript erzeugt die ganz normale Textdatei ESM.TXT; die Datei wird mit einem Shellscript Zeile für Zeile verlängert, zum Beispiel:
| datumundzeit
bash humalog 6 1 # I.-E.-Eingabe
zahl=`cat humalog.vge`
inj=`echo "${zahl}" | sed 's/\./,/g'`
v76=`printf "%5.1f" $inj`
string="Z: ${datum} ${zeit} I Humalog: ${v76} I. E."
tlstrg=${string:23:25}
echo "${string}" >> ESM.TXT
|
Zur Erklärung: Die Funktion datumundzeit, die ich mehrmals brauche, liest das gerade aktuelle Datum und die aktuelle Zeit ein. humalog ist ein kleines Shellscript, das ich selbst geschrieben habe und das Humaloginsulininjektionen speichert. Es lautet ― nur der Vollständigkeit halber ―:
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151 | #!/bin/bash
# ======================================= UNTERPROGRAMME ==========================================
bcumwandlung()
{
nombre=`echo "scale=${dezimal}; ${zahl}/1" | bc` # Die Zahl $zahl wird in eine Zahl mit der Anzahl der gewünschten
# Zahl von Dezimalstellen mit bc umgewandelt.
l=${#nombre} # Länge der so erzeugten Zahl
longueur=`expr $laenge - $l` # Länge des Leerraums vor der Zahl
leerraum=" "
zahl="${leerraum:0:longueur}${nombre}" # Die Zahl im Ausgabeformat
}
# ======================================= HAUPTPROGRAMM ===========================================
# clear
if [ "$1" = "" ]
then
echo "getnum: Programm zur Eingabe von Dezimalzahlen"
echo
echo "Syntax: humalog <Eingabefeldlänge> <Anzahl der Dezimalstellen>"
echo
exit
else
laenge=$1 # Eingabefeldlänge
dezimal=$2 # Anzahl der Dezinmalstellen
vorkomma=`expr $laenge - $dezimal - 1`
leerlaenge=`expr $vorkomma - 1`
leerraum=" "
vide=${leerraum:0:leerlaenge} # Leerzeichen vor „0.00”
nachkommaraum="000000000000000000"
nachkomma=${nachkommaraum:0:dezimal}
zahl="${vide}0.${nachkomma}" # Zahl im Eingabefenster
vorkommazahl=""
nach=""
teil="vorkomma"
backspace="aus"
tput cup 20 40 ; echo -e "$EINS\033[1;37;47m┌────────────────────────────────────────────────────\033[0;47m┐\033[0;47m\033[m"
tput cup 21 40 ; echo -e "$EINS\033[1;37;47m│ \033[0;47m│\033[0;47m\033[40m \033[m"
tput cup 22 40 ; echo -e "$EINS\033[1;37;47m├────────────────────────────────────────────────────\033[0;47m┤\033[0;47m\033[40m \033[m"
tput cup 23 40 ; echo -e "$EINS\033[1;37;47m│ \033[0;47mBitte geben Sie die Humaloginsulindosis ein: \033[0;47m│\033[40m \033[m"
tput cup 24 40 ; echo -e "$EINS\033[1;37;47m│ \033[0;47m┌────────────────────────────────────────────────\033[1;37;47m┐ \033[0;47m│\033[40m \033[m"
tput cup 25 40 ; echo -e "$EINS\033[1;37;47m│ \033[0;47m│ I. E. \033[1;37;47m│ \033[0;47m│\033[40m \033[m"
tput cup 26 40 ; echo -e "$EINS\033[1;37;47m│ \033[0;47m└\033[1;37;47m────────────────────────────────────────────────┘ \033[0;47m│\033[40m \033[m"
tput cup 27 40 ; echo -e "$EINS\033[1;37;47m│ \033[0;47m│\033[40m \033[m"
tput cup 28 40 ; echo -e "$EINS\033[1;37;47m├────────────────────────────────────────────────────\033[0;47m┤\033[40m \033[m"
tput cup 29 40 ; echo -e "$EINS\033[1;37;47m│ \033[0;47m│\033[40m \033[m"
tput cup 30 40 ; echo -e "$EINS\033[1;37;47m└────────────────────────────────────────────────────\033[0;47m┘\033[40m \033[m"
tput cup 31 41 ; echo -e "$EINS\033[40m \033[m"
tput cup 25 44 ; echo -e "\033[44;1;33m${zahl}\033[m" # Darstellung der eingegebenen Zahl in der jeweiligen Farbe
tput cup 47 0 ; echo -e "" # Sehr eigenartig: Bei y-Bildschirm-Koordinaten-Werten >= 47 ist die Eingabe im
# Eingabefenster o. k., bei kleineren Werten verrutscht das Fenster.
direkt=""
while [ "${direkt}" != "x" ]
do
stty cbreak -echo
direkt=`dd bs=1 count=1 2>&-`
stty -cbreak echo
case $direkt in
$'\x1B')
dialog --yesno "Wollen Sie die Eingabe abbrechen?" 0 0
ausgabe=$?
if [ $ausgabe = 0 ]
then
exit
fi
dialog=""
;;
".")
teil="nachkomma"
direkt=""
backspace="aus"
;;
$'\x7F')
if [ "${teil}" = "vorkomma" ]
then
vorkommazahllaenge=${#vorkommazahl}
vorkommazahllaenge=`expr $vorkommazahllaenge - 1`
vorkommazahl="${vorkommazahl:0:vorkommazahllaenge}"
else
nachkommazahllaenge=${#nach}
nachkommazahllaenge=`expr $nachkommazahllaenge - 1`
if [ $nachkommazahllaenge -lt 0 ]
then
nachkommazahllaenge=0
fi
nach=${nach:0:nachkommazahllaenge}
fi
nachkomma="${nach}000000000000000000000000000"
nachkomma=${nachkomma:0:dezimal}
zahl="${vorkommazahl}.${nachkomma}"
bcumwandlung
backspace="ein"
;;
[0-9]) # Normale Zahleneingabe
if [ "${teil}" = "vorkomma" ]
then # Zahl vor dem Dezimalpunkt
vorkommazahl="${vorkommazahl}${direkt}"
if [ $leerlaenge -ge 0 ]
then
vide=${leerraum:0:leerlaenge}
fi
else
nach="${nach}${direkt}"
nachkomma="${nach}00000000000000000000000"
nachkomma=${nachkomma:0:dezimal}
fi
zahl="${vorkommazahl}.${nachkomma}"
if [ "${teil}" = "vorkomma" ]
then
leerlaenge=`expr $leerlaenge - 1`
fi
bcumwandlung
backspace="aus"
;;
[A-Za-z])
direkt="" # Bei Buchstaben tue einfach nichts.
;;
*) # Alternative für <RETURN>
echo ${zahl} > humalog.vge
direkt="x" # Abbruchkriterium
;;
esac
tput cup 24 44 ; echo -e "\033[44;1;33m${zahl}\033[m"
done
fi
clear
|
In der letzten Zeile des ersten Shellscripts steht die Zeile:
Nun stelle ich seit vorgestern fest, dass ungewollt, ca. zwanzig mal pro Minute, an meine Datei ESM.TXT die Zeile
| Z: Mi 16.08.2017 12:09 I Humalog: 0,0 I. E.
|
angehängt wird, wobei sich Datum und Uhrzeit natürlich ständig ändern. Ich hatte zunächst ― sicher unprofessionell ― versucht, durch eine if-Bedingung das Shellprogramm am weiteren sinnlosen Anhängen von 0-Einheiten-Humalog-Injektionen zu hindern ..., bis ich feststellen musste, dass die Datei ESM.TXT auch dann ständig weiterwächst, wenn gar kein Shellcript aufgerufen wurde. Wenn ich die Datei ESM.TXT aufrufe, um mir die Sache anzusehen, passiert Folgendes: 1. Rufe ich <Strg>S auf, um die Datei zu speichern, kommt folgende Fehlermeldung:
| Die Datei „file:///home/rlpclin/EDV/assist/ESM.TXT” wurde von einem anderen Programm geändert. Möchten Sie die unveränderte Datei wirklich speichern? Sie könnten damit geänderte Datei auf der Festplatte überschreiben?
|
Es kommt dann die Wahl:
| „Trotzdem speichern” ― „Abbrechen”
|
Rufe ich <Alt><F4> auf, um das Fenster mit der Datei ESM.TXT unverändert zu schließen, kommt:
| Datei auf der Festplatte geändert ― KWrite
Was möchten Sie tun?
[ ] Änderungen bei Leerräumen ignorieren [ ] Unterschiede anzeigen
[Überschreiben] [Datei erneut laden] [Änderungen ignorieren] [Abbrechen}
|
(Mit den eckigen Klammern habe ich versucht, die Anklick-Buttons zu simulieren. Klicke ich auf „Unterschiede anzeigen”, kommt: | Informationen ― Postfach-Assistent
Could not open the file, probably due to un unsupported file format
tar:///tmp/kwrite.L18278
[Erneut versuchen] [Abbrechen]
|
Klicke ich auf „Abbrechen›, erscheint:
| Art des Postfachs auswählen
|
Ich bin nun wirklich ratlos, zumal ich nie ein Postfach verwendet habe und ich mir auch keinen Zusammenhang zwischen einer ins Uferlose wachsenden Textdatei ESM.TXT und einem Postfach vorstellen kann. Als Laie frage ich mich, ob ich ein Virus habe (dabei hatte ich mich als Linux User immer vor Viren sicher gefühlt ...). Wenn Ihr mir weiterhelfen könntet, wäre ich Euch sehr dankbar. Rhaban
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17604
Wohnort: Berlin
|
Das Programm läuft wohl mehrfach im Hintergrund, ich nehme an per cronjob oder gestartete Testinstanzen Deines Scripts. Manche Editoren überwachen die Datei auf dem Datenträger, und warnen einen, wenn ein anderes Programm (zum Beispiel unkontrollierte Instanzen Deines Scripts) die Datei ändern. Wenn die Daten wichtig sind, kannst Du Deine Datei unter neuem Namen speichern, um sie später zu korrigieren. Was das mit Email zu tun hat weiß ich auch nicht - offenbar ein Folgeproblem.
|
Rhaban
(Themenstarter)
Anmeldungsdatum: 25. Juni 2016
Beiträge: 469
Wohnort: München
|
Hallo, user_unknown, vielen Dank für Deine rasche Antwort! Du schriebst:
Das Programm läuft wohl mehrfach im Hintergrund, ich nehme an per cronjob oder gestartete Testinstanzen Deines Scripts.
cronjob verwende ich nicht; da das Shellscript ja funktioniert, läuft während des „richtigen” Laufs auch kein anderes oder gleiches Shellscript.
Manche Editoren überwachen die Datei auf dem Datenträger, und warnen einen, wenn ein anderes Programm (zum Beispiel unkontrollierte Instanzen Deines Scripts) die Datei ändern.
Das mag zwar sein, aber selbst dann, wenn nur die Shell geöffnet ist und gar kein Shellscript läuft, wird zu bestimmten Zeiten an die Datei ESM.TXT sinnloserweise
| Z: Mi 16.08.2017 12:09 I Humalog: 0,0 I. E.
|
(halt immer mit dem aktuellen Datum und der aktuellen Uhrzeit) angehängt. Ich habe inzwischen von der Shell aus ― es lief kein Shellscript ― eingegeben:
Nach ein paar Sekunden wies
aus, dass eine Datei ESM.TXT wieder neu generiert worden war und dass ständig wieder dieselben Zeilen angehängt wurden. Ich habe dann den Rechner heruntergefahren und neu gestartet, dann war wenigstens für eine gewisse Zeit Ruhe, so dass ich vernünftig arbeiten konnte.
Wenn die Daten wichtig sind, kannst Du Deine Datei unter neuem Namen speichern, um sie später zu korrigieren.
Ich brauche die Datei ESM.TXT sehr häufig. Sinn der Sache ist, dass ich Diabeteseingaben, aber auch Buchungen und Termine in der Datei ESM.TXT zwischenspeichere, um sie dann noch einmal kurz zu überfliegen und mit einem anderen Shellscript weiterzuverarbeiten (in die Diabetes-Werte-Datei, in die Buchungsdatei, in die Kalenderdatei und in ein paar andere Dateien). Ich habe im Grunde ein altes MS-DOS-Programm nach Linux/Shellscript übertragen; unter DOS hat alles sehr gut funktioniert, aber der Rechner war natürlich nicht mit dem Internet verbunden. Da das neue Blutzuckermessgerät die Blutzuckerwerte als csv-Datei ausgibt und eine graphische Darstellung der Blutzuckerwerte erlaubt ― bei mir als svg-Datei ―, habe ich das zum Anlass genommen, die meisten Dinge aus dem alten MS-DOS-Programm nach Kubuntu zu übertragen; natürlich musste ich alles neu als Shellscript programmieren. Und bis vor zwei Tagen hat auch alles bestens funktioniert ... Wenn es eine Lösung für mein Problem gäbe, wäre ich sehr dankbar. Viele Grüße! Rhaban
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17604
Wohnort: Berlin
|
Dein erster Codeblock scheint, wegen der Einrückung, aus einem längeren Skript zu stammen. Das müsste man in gänze sehen, um sagen zu können, was wieso schief läuft.
Ich habe dann den Rechner heruntergefahren und neu gestartet, dann war wenigstens für eine gewisse Zeit Ruhe, so dass ich vernünftig arbeiten konnte.
Und jetzt läuft es wieder Amok? Die Idee, Deine Datei unter neuem Namen zu speichern, sollte dazu dienen, den Fehler zu suchen, erst den der häufigen Aktualisierung, während neue Messwerte einlaufen - nicht als Dauerlösung. Wie oft wird die Datei denn mit den 0-Werten aktualisiert? Ist das regelmäßig? Halbwegs regelmäßig? Nur eine Nebenbemerkung: Backticks sollte man nicht verwenden, sondern $(...) stattdessen. Es ist besser lesbar, tippbar und lässt sich besser schachteln.
| inj=`echo "${zahl}" | sed 's/\./,/g'`
inj=$(echo "${zahl}" | sed 's/\./,/g')
|
Einfacher geht das auch mit Patternersetzung direkt in der Shell:
|
Rhaban
(Themenstarter)
Anmeldungsdatum: 25. Juni 2016
Beiträge: 469
Wohnort: München
|
Hallo, user_unknown, vielen Dank für Deine Nachricht von gestern Abend! Bitte entschuldige, dass ich erst jetzt reagieren kann; ich hatte mehrfach beim Versuch, diese Nachricht abzusenden, die Meldung „Serverstörung” bekommen. Vej hat mir dann geraten, außergewöhnliche Sonderzeichen zu ersetzen. Da ich in meinen Programmen schon mal ähnliche Probleme hatte, habe ich meine Hauptdatei ESM.TXT mit | cat ESM.TXT | sed 's/\xC2\xA0/ /g' > 1.vge
|
ersetzt; das Gleiche habe ich auch mit dem Text dieser Nachricht (den ich als Textdatei zwischengespeichert hatte) gemacht. Ich bin gespannt, ob es jetzt klappt, oder ob ich noch andere außergewöhnlichen Zeichen ersetzen muss ... Nun zu Deiner Nachricht:
Dein erster Codeblock scheint, wegen der Einrückung, aus einem längeren Skript zu stammen. Das müsste man in gänze sehen, um sagen zu können, was wieso schief läuft.
Ich kann Dir das ganze Shellscript, es heißt assistyz.sh ― natürlich gerne in voller Länge zusenden. Vielleicht ist es ja auch für andere Diabetiker, die Linux verwenden, interessant ...
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676 | # ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡ FUNKTIONEN ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
datumundzeit()
{
bash getdatedialog
datum=`cat getdate.dta` # „Do 23.02.2017”
bash getnum_zeit
z=`cat zeit.vge` # „18.39”
z1=${z:0:2} # Stunden
z2=${z:3:2} # Minuten
zeit="${z1}:${z2}" # „18:39”
}
# =================================================== Mahlzeitenliste ================================================
Anzeige(){
dialog --colors --title " Mahlzeiten " --infobox "${string}\n\n\Z4${liste}\Zn" 31 44 2>mz.vge # Die Breite 44 richtet sich nach der Zeilenbreite in der Datei
# mahlzeiten.DTA.
}
# =================================================== printf-Zahl ====================================================
zzahl()
{
zahl1=`cat zahl.vge | sed 's/\./,/g'` # Diese Variable wird (zunächst mit Dezimalpunkt) nach $zahl1 ausgelesen und
# ― wegen printf ― auf Dezimalkomma umgestellt.
zahl2=`printf "%9.2f" $zahl1`
}
# ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡ HAUPTSCHLEIFE ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
bmg1=`cat blutzuckermessgeraet.dta`
bmg2=${bmg1:0:1} # Es soll als Erstes das voreingestellte Blutzuckermessgerät bestimmt werden. Derzeit kommen nur zwei
# Blutzuckermessgeräte in Frage: F: Freestyle Libre und A: Accu Chek. Um allen orthographischen
# Schwierigkeiten aus dem Wege zu gehen, werde stets nur der erste Buchstabe betrachtet. Derzeit
# (Mo 05.06.2017) ist zu erwarten, dass das Freestyle-Libre-Gerät auf Dauer verwendet werden wird.
hs="E"
v6="E" # Schleife
until [ "${v6}" = "X" ]
do
temps=`date '+%Y%m'` # "201706"
bluzu="ZU${temps}.DTA" # ZU201706.DTA
letzteintrag=`cat "${bluzu}" | tail -1`
letzt=${letzteintrag:0:24}
if [ ${bmg2} = "F" ]
then
bmg="Freestyle-Libre-Gerät"
else
bmg="Accu-Chek-Gerät"
fi
dialog --colors --backtitle " \Z1DIABETESVERWALTUNGSPROGRAMM\Zn " --title " \Z1Diabetesverwaltung\Zn " --infobox "\n\Z1Diabetes\
eingaben\Zn \Z0\ZbLetzter Eint\
rag in \Zn\Z4${bluzu}\Zn\Z0\Zb: \Z7\Zb${letzt}\Zn\n\n\
\Z1<RETURN>\Zn Insulininjektionen \Z0\Zb[I. E.]\Zn\n\
\Z1 B\Zn Blutzucker \Z0\Zb[mmol/L]\Zn, \Z0\Zb[mg/dL]\Zn\n\
\Z1 C\Zn \Z1C\Znoncatenate: Aneinanderhängung mehrerer \Z4svg\Zn-Dateien\n\
\Z1 E\Zn Datei \Z0\ZbESM.TXT\Zn editieren\n\
\Z1 G\Zn Gewicht \Z0\Zb[kp]\Zn, \Z0\Zb[N]\Zn\n\
\Z1 H\Zn HbA₁c\Z0\Zb[%]\Zn\n\
\Z1 I\Zn Immer wiederkehrende Mahlzeiten\n\
\Z1 M\Zn Mahlzeiteneingabe nach \Z4ESM.TXT\Zn \Z0\Zb[BE]\Zn\n\
\Z1 N\Zn Mahlzeiteneingabe nach \Z4mahlzeiten.DTA\Zn \Z0\Zb[BE]\Zn\n\
\Z1 P\Zn Ausdruck\n\
\Z1 R\Zn Blutzuckerwerteübertragung vom ${bmg} auf den Rechner\n\
\Z1 S\Zn Erzeugung der \Z4svg\Zn-Dateien (nur bei Verwendung des Akku-Chek-Gerätes)\n\
\Z1 T\Zn Texteingabe\n\
\Z1 U\Zn Unterzuckerungen\n\
\Z1 V\Zn Vorgabe Insulindosen\n\
\Z1 W\Zn Blutzuckermessgerätvoreinstellung wechseln (Derzeit eingestellt: \Z4${bmg}\Zn)\n\
\Z1 X\Zn Ende\n\
\Z1 Z\Zn Eingabe Mahlzeiten gegen Unterzucker (Dextroenergen u. A.)\n\n" 24 101
stty cbreak -echo # aus lied
v6=`dd bs=1 count=1 2>&-`
stty -cbreak echo
echo $v6 | tr '\033' ':'
v6=`echo ${v6} | tr "[:lower:]" "[:upper:]"`
# Es soll ein Doppelpunkt ausgegeben werden, falls versehentlich <ESCAPE> gedrückt wurde.
case $v6 in
"B") # --- Blutzuckerwerte bash getdatedialog
datumundzeit
bash schaetzung 6 1
v66=`printf "%9.0f" $zahlmgdLkomma` schaetzmmolLpunkt=`cat schaetzung.vge` # Ergebnis ist eine Dezimalzahl mit Punkt, etwa: „10.0”.
schaetzmmolLkomma=`echo $schaetzmmolLpunkt | sed 's/\./,/g'` # Ergebnis ist nun „10,0”.
schaetzmgdLkomma=`echo "$schaetzmmolLpunkt * 18.0182" | bc -l | sed 's/\./,/g'` # „180,11 ...”
schaetzmgdLpunkt=`echo "$schaetzmmolLpunkt * 18.0182" | bc -l` # „180.11 ...”
v4=`printf "%9.0f" $schaetzmgdLkomma`
v5=`printf "%9.2f" $schaetzmmolLkomma`
string="Z: ${datum} ${zeit} B Schätzung: ${v4} mg/dL ${v5} mmol/L"
echo "${string}" >> ESM.TXT
bash blutzucker 6 1
zahlmmolLpunkt=`cat blutzucker.vge` # Wieder Dezimalzahl mit Punkt, etwa „8.1”
zahlmmolLkomma=`echo $zahlmmolLpunkt | sed 's/\./,/g'` # Hier nun Komma. „8,1”
zahlmgdLkomma=`echo "$zahlmmolLpunkt * 18.0182" | bc -l | sed 's/\./,/g'`
zahlmgdLpunkt=`echo "$zahlmmolLpunkt * 18.0182" | bc -l`
v66=`printf "%9.0f" $zahlmgdLkomma`
v5=`printf "%9.2f" $zahlmmolLkomma`
string="Z: ${datum} ${zeit} B Blutzucker: ${v66} mg/dL ${v5} mmol/L"
echo "${string}" >> ESM.TXT
diff1=`echo "$v4 - $v66" | bc -l`
diff2=`echo "$schaetzmmolLpunkt - $zahlmmolLpunkt" | bc -l | sed 's/\./,/g'`
v4=`printf "%9.0f" $diff1`
v5=`printf "%9.2f" $diff2`
string="Z: ${datum} ${zeit} B Differenz: ${v4} mg/dL ${v5} mmol/L"
echo "${string}" >> ESM.TXT
;;
"C") # Aneinanderhängung mehrerer svg-Dateien
bash c_svg.sh
;;
"E")
kwrite ESM.TXT
;;
"G") # Gewicht
datumundzeit
dialog --colors --backtitle " \Z1DIABETESVERWALTUNGSPROGRAMM\Zn " --title " Gewicht " --inputbox \
"Bitte geben Sie ihre Masse in der Einheit \Z4Kilogramm\Zn (\Z4kg\Zn) ein. Das Programm wird hieraus Ihr \
Gewicht in \Z4Kilopond\Zn (\Z4kp\Zn) und in \Z4Newton\Zn (\Z4N\Zn) errechnen. Beachten Sie bitte, dass die \
Einheit Kilopond seit 01.01.1978 eigentlich nicht mehr verwendet werden darf.\n \n" 0 0 2>masse.vge
masse1=`cat masse.vge` # Dezimalzahl mit einer Stelle hinter dem Komma
masse2=`echo ${masse1} | sed 's/,/\./g'` # Ein etwaiges Komma wird für bc in einen Punkt umgewandelt.
gewkp=`echo "$masse2 * 1" | bc -l`
gewn=`echo "$masse2 * 9.80665" | bc -l`
gewkpkomma=`echo ${gewkp} | sed 's/\./,/g'`
gewnkomma=`echo ${gewn} | sed 's/\./,/g'`
v4=`printf "%5.1f" $gewkpkomma`
v5=`printf "%6.1f" $gewnkomma`
string="Z: ${datum} ${zeit} T Gewicht: ${v4} kp ≜ ${v5} N"
echo "${string}" >> ESM.TXT
;;
"M") # Mahlzeiten datumundzeit
# ≡≡≡≡≡≡≡≡≡≡≡≡≡≡ DIABETES-HAUPTPROGRAMM ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
# ============== EINGABE VON MAHLZEITEN ==================================================================================================
clear
rm -f *.vge
datumundzeit
aussenschleife="E"
be_zwischensumme="0" # Die BE-Werte der einzelnen Mahlzeiten sollen mit bc addiert werden. Jede Mahlzeit wird mit „+ <BE-Wert>”
# an den String ${be_zwischensumme} angehängt.
dialog --colors --backtitle " \Z1DIABETESVERWALTUNGSPROGRAMM\Zn " --title " Eingabemodus " --infobox "\nWi\
e soll der erste Wert erfasst werden?\n\n\Z4<RETURN>\Zn über die \Z4Tastatur\Zn\n\Z1 #\Zn über den \Z1Barcodescanner\Zn\n\n" 0 0
stty cbreak -echo
modus=`dd bs=1 count=1 2>&-`
stty -cbreak echo
echo $modus >> asl.vge
vv1=`echo $modus | tr '\033' ':'`
until [ "${aussenschleife}" = "X" ]
do
if [ "${modus}" = "#" ]
then
dialog --colors --backtitle " \Z1DIABETESVERWALTUNGSPROGRAMM\Zn " --title " Eingabe über den Barc\
odescanner " --inputbox "\Zn\nBitte geben Sie den Barcode mit dem Scanner e\
in und drücken Sie dann \Z4<RETURN>\Zn:\n \n" 0 0 2>barcode.vge
barcode=`cat barcode.vge`
# --------- Ist der Barcode bereits in mahlzeiten.DTA gespeichert? ------------------------------------------------------
barcodemahlzeit=`grep "${barcode}" mahlzeiten.DTA | sed '1q'` # Bei mehrzeiligen grep-Ergebnis soll stets nur die erste
# Zeile verwendet werden.
laenge=${#barcodemahlzeit}
if [ $laenge -lt 4 ] # ----------------- Barcode ist noch nicht gespeichert. -----------------------------
then
barcodemahlzeit="${barcode}"
dialog --colors --title " Eingabe über den Barcodescanner " --inputbox "\n\Z5Zu der Barcodenummer \Z5\Zb${barcode}\Zn\Z5 konnte \
bisher noch keine eingetragene Mahlzeit gefunden werden.\Zn\n\nBitte ergänzen Sie den noch fehlenden Mahlze\
itentext und drücken Sie dann \Z4<RETURN>\Zn.\n \n" 0 0 "${barcodemahlzeit}" 2>endstring.vge
endstring=`cat endstring.vge`
bash calculatrice.sh
endstring="${endstring} "
endstring=${endstring:0:50} # 51 Zeichen vor der BE-Zahl
bewert=`cat loesung.vge`
bash getnum_be "${bewert}" # Vorgabe BE-Wert; das Ergebnis wird in zahl.vge gespeichert.
zzahl
else # ---------------- Barcode ist bereits gespeichert. ---------------------------------
zahl=${barcodemahlzeit:54:5} # Schneide die BE-Zahl aus der Variable $barcodemahlzeit aus.
echo "${zahl}" > zahl.vge # Das Unterprogramm (Die Funktion) zzahl liest die BE-Zahl aus der Datei zahl.vge.
dialog --colors --backtitle " \Z1DIABETESVERWALTUNGSPROGRAMM\Zn " --title " Eingabe ü\
ber den Barcodescanner " --infobox "\n\Z4Zu der Barcodenummer \Z4\Zb${barcode}\Zn\Z4 \
wurde die folgende Mahlzeit gefunden:\Zn\n\n\Z4${barcodemahlzeit}\Zn\n\n\
\Z4 <RETURN>\Zn Mahlzeit ohne Änderung übernehmen\n\
\Z4<andere Eingabe>\Zn Vorhandene Eingabe ändern\n \n" 0 0
./keyget_007 > keyget_f.vge # keyget lässt, im Gegensatz zu getkey, die Pfeile „--> ” bei der Ausgabe weg.
bcm=`cat keyget_f.vge`
echo "${bcm}" >> bcm.vge
case $bcm in
10)
echo "${barcodemahlzeit}" > endstring.vge
endstring=`cat endstring.vge`
bewert=${endstring:54:5} # Schneide die BE-Zahl aus.
vorgabe=`echo ${v5} | sed 's/,/\./g'` # Da die Zahl vorgabe im Unterprogramm calculatrice (und damit unter bc)
# weiterverwendet werden soll, wird das Dezimalkomma durch einen Dezimalpunkt ersetzt.
endstring="${endstring} "
endstring=${endstring:0:50} # 51 Zeichen vor der BE-Zahl
zzahl
;;
*)
endstring=`cat endstring.vge`
v5=${endstring:54:5} # Schneide die BE-Zahl aus.
vorgabe=`echo ${v5} | sed 's/,/\./g'` # Da die Zahl vorgabe im Unterprogramm calculatrice (und damit unter bc)
# weiterverwendet werden soll, wird das Dezimalkomma durch einen Dezimalpunkt ersetzt.
bash calculatrice.sh "${vorgabe}"
endstring="${endstring} "
endstring=${endstring:0:50} # 51 Zeichen vor der BE-Zahl
bewert=`cat loesung.vge`
bash getnum_be "${bewert}" # Vorgabe BE-Wert; das Ergebnis wir echo "Z: ${datum} ${zeit} M ${mz_endgueltig}" >> ESM.TXTd in zahl.vge gespeichert.
zzahl
;;
esac
fi
else
schleife="E"
string=""
tput cup 11 15 ; echo -e "$EINS\033[1;37;47m┌────────────────────────────────────────────────────────────────────────\033[0;47m┐\033[0;47m\033[m"
tput cup 12 15 ; echo -e "$EINS\033[1;37;47m│ \033[0;47m│\033[0;47m\033[40m \033[m"
tput cup 13 15 ; echo -e "$EINS\033[1;37;47m├────────────────────────────────────────────────────────────────────────\033[0;47m┤\033[0;47m\033[40m \033[m"
tput cup 14 15 ; echo -e "$EINS\033[1;37;47m│ \033[0;47mEingabe der Mahlzeiten \033[0;47m│\033[0;47m\033[40m \033[m"
tput cup 15 15 ; echo -e "$EINS\033[1;37;47m│ \033[0;47m│\033[0;47m\033[40m \033[m"
tput cup 16 15 ; echo -e "$EINS\033[1;37;47m│ <RETURN> \033[0;47mVorgegebene Mahlzeit ohne Änderung übernehmen \033[0;47m│\033[0;47m\033[40m \033[m"
tput cup 17 15 ; echo -e "$EINS\033[1;37;47m│ <down> \033[0;47mTexteingabe bis zum Cursor übernehmen \033[0;47m│\033[0;47m\033[40m \033[m"
tput cup 18 15 ; echo -e "$EINS\033[1;37;47m│ <Backspace> \033[0;47mVorangegangenen Buchstaben löschen \033[0;47m│\033[0;47m\033[40m \033[m"
tput cup 19 15 ; echo -e "$EINS\033[1;37;47m│ \033[0;47m│\033[0;47m\033[40m \033[m"
tput cup 20 15 ; echo -e "$EINS\033[1;37;47m│ \033[0;47m┌────────────────────────────────────────────────────────────────────\033[1;37;47m┐ \033[0;47m│\033[40m \033[m"
tput cup 21 15 ; echo -e "$EINS\033[1;37;47m│ \033[0;47m│ \033[1;37;47m│ \033[0;47m│\033[40m \033[m"
tput cup 22 15 ; echo -e "$EINS\033[1;37;47m│ \033[0;47m└\033[1;37;47m────────────────────────────────────────────────────────────────────┘ \033[0;47m│\033[40m \033[m"
tput cup 23 15 ; echo -e "$EINS\033[1;37;47m│ \033[0;47m│\033[40m \033[m"
tput cup 24 15 ; echo -e "$EINS\033[1;37;47m├────────────────────────────────────────────────────────────────────────\033[0;47m┤\033[40m \033[m"
tput cup 25 15 ; echo -e "$EINS\033[1;37;47m│ \033[0;47m│\033[40m \033[m"
tput cup 26 15 ; echo -e "$EINS\033[1;37;47m└────────────────────────────────────────────────────────────────────────\033[0;47m┘\033[40m \033[m"
tput cup 27 16 ; echo -e "$EINS\033[40m \033[m"
until [ "${schleife}" = "X" ]
do
./keyget_007 > keyget_e.vge # keyget lässt, im Gegensatz zu getkey, die Pfeile „--> ” bei der Ausgabe weg.
direkt=`cat keyget_e.vge`
echo "${direkt}" >> direkt.vge
case $direkt in
10) # Eingabe von <RETURN>
endstring="${ergebnis}" # Mahlzeit endgültig ausgewählt, mit Anzahl der Broteinheiten
bewert=${ergebnis:54:5} # Der BE-Wert steht ab Spalte 55 (hier Spalte 54, da ab 0 gezählt wird).
bash getnum_be "${bewert}" # Vorgabe BE-Wert; das Ergebnis wird in zahl.vge gespeichert.
zzahl
echo "${endstring}" > endstring.vge
schleife="X"
;;
127) # Eingabe von <Backspace>
laenge=${#string} # Derzeitige Länge des Strings
if [ $laenge -gt 1 ] # Keine Stringlänge 0 oder unter 0!
then
kuerzer=`expr $laenge - 1` # Stringlaenge um 1 verkürzen
fi
string1="${string}"
string="${string1:0:kuerzer}" # String um einen Buchstaben verkürzen
;;
down) # Nur bei <down> wird eine neue Mahlzeit nach mahlzeiten.DTA gespeichert.
endstring="${string}"
bash calculatrice.sh
endstring="${endstring} "
endstring=${endstring:0:50} # 51 Zeichen vor der BE-Zahl
bewert=`cat loesung.vge`
bash getnum_be "${bewert}" # Vorgabe BE-Wert; das Ergebnis wird in zahl.vge gespeichert.
zzahl
echo "${endstring}" > endstring.vge
schleife="X" # Schleife wird verlassen.
;;
*)
string="${string}${direkt}"
;;
esac
# string=`echo "${string}" | sed 's/ae/ä/g;s/oe/ö/g;s/ue/ü/g;s/Ae/Ä/g;s/Oe/Ö/g;s/Ue/Ü/g;s/sz/ß/g'`
ergebnis=`grep "^${string}" mahlzeiten.DTA | sed '1q'` # Bei mehrzeiligen grep-Ergebnis soll stets nur die erste
# Zeile verwendet werden.
# ergebnistext=${ergebnis:0:50} # Die BE-Zahl soll, solange Mahlzeiten eingegeben werden, nicht angezeigt werden.
tput cup 21 19 ; tput setaf 2 ; echo -e " " # Eigentlich schwachsinnige Lösung, um die Verwendung der
# Löschenden Backspacetaste möglich zu machen
tput cup 21 19 ; tput setaf 1 ; echo -e "${ergebnis}"
tput cup 21 19 ; tput setaf 0 ; echo -e "${string}"
done
fi
# ===== Ab hier: Verwendung für beide Eingabemöglichkeiten: Barcode und Text =================================================================
endstring=`cat endstring.vge`
endstring="${endstring} "
endstring=${endstring:0:50}
mz_endgueltig="${endstring}${zahl2}"
echo "${mz_endgueltig}" > endstring.vge # Anstelle der inputbox der nächsten Zeile
# dialog --colors --inputbox "\nBitte bestätigen Sie die eingegebene Mahlzeit mit \Z4<RE\
# TURN>\Zn.\n \n" 12 67 "${mz_endgueltig}" 2>endstring.vge
# endstring=`cat endstring.vge`
# =================== Handelt es sich um einen Barcode? =============================================================
barcode=${mz_endgueltig:0:8} # Barcodes können 13 Zeichen lang sein ― 4260175670484 ― , sie können aber auch kürzer sein.
if [[ `echo "$barcode" | grep -E ^[[:digit:]]+$` ]] # Nach https://forum.ubuntuusers.de/topic/wie-teste-ic\
# h-ob-die-eingabe-eine-zahl-ist-ba/ ― Es ist ein Barcode. --------------------------------------------------------------
then
mz_ohne_barcode=${mz_endgueltig:13}
mz77="${mz_ohne_barcode} " # Um nicht immer dieselbe Variable zu verwenden
# ― mz_ohne_barcode ― werden zwei Behelfsvariablen
# ― m77 und m78 ― verwendet.
mz78=${mz77:0:37} # Wert von 50 auf 37 reduziert,
# um die etwa schon vorhandene BE-Zahl
# zu tilgen.
mz79="${mz78} "
mz80=${mz79:0:50}
mz_ohne_barcode="${mz80}${zahl2}"
echo "Z: ${datum} ${zeit} M ${mz_ohne_barcode}" >> ESM.TXT
echo "Z: ${datum} ${zeit} M ${mz_ohne_barcode}\n" >> mz.vge
endstring="${endstring} "
endstring=${endstring:0:50}
mz_endgueltig="${endstring}${zahl2}"
# --------------------- Übertrag nach mahlzeiten.DTA? ------------------------------------------------------------
teilcode=${mz_endgueltig:0:20} # Zur Darstellung etwa gefundener Mahlzeiten auf dem nächsten Bildschirm; es soll aber
# nur die eine Variable mz_endgueltig verwendet werden.
vorhanden=`grep "${teilcode}" mahlzeiten.DTA | sed '1q'` # Bei mehrzeiligen grep-Ergebnis soll stets nur die erste
# Zeile verwendet werden.
vh=$? # Wurde kein String gefunden, müsste der Kontrollwert ungleich 0 sein.
teilstring1=${vorhanden:0:59} # Nur die ersten 59 Zeichen; sie umfassen den Namen der Mahlzeit und die BE-Zahl.
teilstring2=${mz_endgueltig:0:59}
if [ "${teilstring1}" != "${teilstring2}" ] # Besteht der Eintrag bereits in mahlzeiten.DTA, soll das Fenster nicht angezeigt werden.
then
if [ $vh -ne 0 ]
then
dialog --colors --backtitle " \Z1DIABETESVERWALTUNGSPROGRAMM\Zn " --title " Übernahme nach \Z4mahl\
zeiten.DTA\Zn? " --infobox "\nEs wurde in der Datei \Z4mahlzeiten.DTA\Zn \
die Mahlzeit \Z4${mz_endgueltig}\Zn nicht gefunden.\n\n\
Wollen Sie die Mahlzeit nach \Z4mahlzeiten.DTA\Zn speichern?\n\n\
\Z4 J\Zn Ja\n\
\Z4<RETURN>\Zn Nein\n\n" 0 0
fi
stty cbreak -echo
mzueb=`dd bs=1 count=1 2>&-`
stty -cbreak echo
echo $mzueb > mzueb.vge
vv1=`cat mzueb.vge`
vv1=`echo ${vv1} | tr "[:lower:]" "[:upper:]"`
if [ "${vv1}" = "J" ]
then
# echo "${mz_ohne_barcode}" >> mahlzeiten.DTA
cp mahlzeiten.DTA mahlzeiten.alt.vge # Nur zur Sicherheit
echo "${mz_endgueltig}" >> mahlzeiten.DTA
cat mahlzeiten.DTA | sort > mzt.vge
cat mzt.vge | uniq > mahlzeiten.DTA
fi
fi
else
# ------------------------------ ― Es ist kein Barcode. -------------------------------------------------------------
endstring="${endstring} "
endstring=${endstring:0:50}
mz_endgueltig="${endstring}${zahl2}"
teilcode=${mz_endgueltig:0:20} # Zur Darstellung etwa gefundener Mahlzeiten auf dem nächsten Bildschirm;
# es soll aber nur die eine Variable
# mz_endgueltig verwendet werden.
vorhanden=`grep "${teilcode}" mahlzeiten.DTA | sed '1q'` # Bei mehrzeiligen grep-Ergebnis soll stets nur die erste
# Zeile verwendet werden.
laevh=${#vorhanden} # Länge der Variablen $vorhanden
teilstring1=${vorhanden:0:59} # Nur die ersten 59 Zeichen; sie umfassen den Namen der Mahlzeit und die BE-Zahl.
teilstring2=${mz_endgueltig:0:59}
if [ ${laevh} -lt 3 ] # Besteht der Eintrag bereits in mahlzeiten.DTA, soll das Fenster nicht angezeigt werden.
then
# dialog --msgbox "Die Variable mz_endgueltig hat den folgenden Wert: \n\n$mz_endgueltig" 0 0
dialog --colors --backtitle " \Z1DIABETESVERWALTUNGSPROGRAMM\Zn " --title " Übernahme nac\
h \Z4mahlzeiten.DTA\Zn? " --infobox "\nWollen Sie diesen Eintrag ...\n\n\
\Z4${mz_endgueltig}\Zn\n\n... nach \Z4mahlzeiten.DTA\Zn übernehmen?\n\n\
Es wurde bisher in \Z4mahlzeiten.DTA\Zn der folgende Eintrag gefunden:\n\n\
\Z4${vorhanden}\Zn\n\n\
\Z4 J\Zn Ja\n\
\Z4<RETURN>\Zn Nein\n\n" 0 0
stty cbreak -echo
mzueb=`dd bs=1 count=1 2>&-`
stty -cbreak echo
echo $mzueb > mzueb.vge
vv1=`cat mzueb.vge`
vv1=`echo ${vv1} | tr "[:lower:]" "[:upper:]"`
if [ "${vv1}" = "J" ]
then
# echo "${mz_ohne_barcode}" >> mahlzeiten.DTA
cp mahlzeiten.DTA mahlzeiten.alt.vge # Nur zur Sicherheit
echo "${mz_endgueltig}" >> mahlzeiten.DTA
cat mahlzeiten.DTA | sort > mzt.vge
cat mzt.vge | uniq > mahlzeiten.DTA
fi
fi
laemzendg=${#mz_endgueltig}
if [ $laemzendg -gt 3 ] # Es soll vermieden werden, dass irrtümlich eine Mahlzeiten-Leerzeile
# nach ESM.TXT geschrieben wird.
then
echo "Z: ${datum} ${zeit} M ${mz_endgueltig}" >> ESM.TXT
fi
echo "Z: ${datum} ${zeit} M ${mz_endgueltig}\n" >> mz.vge # „\n”: Darstellung in dem Fenster „Weitere Mahlzeit?” erfordert zusätzliches \n.
fi
# dialog --colors --title " Eintrag in die Datei \Z4ESM.TXT\Zn " --msgbox "\nEs wurde der folgende String in die Datei \Z4ESM.TXT\Zn eingetragen:\n\n${mz_endgueltig}\n\n" 0 0 2>>1.vge
mz=`cat mz.vge`
zahl1=`echo ${zahl2} | sed 's/,/\./g'` # $zahl2 wird (zunächst mit Dezimalkomma) nach $zahl1 ausgelesen und
# ― wegen bc ― wieder auf Dezimalpunkt rückumgestellt. Die neue Variable heißt $zahl1.
be_zwischensumme="${be_zwischensumme} + ${zahl1}" # Anhängung des nächsten BE-Wertes
dialog --colors --backtitle " \Z1DIABETESVERWALTUNGSPROGRAMM\Zn " --title " Weitere Mahlze\
it? " --infobox "\nSie haben bisher für diese Mahlzeit die folgenden Teilmahlzeiten \
eingegeben:\n\n\Z3$mz\n\
\Z4<RETURN>\Zn Weitere Teilmahlzeit \Z4als Text\Zn erfassen\n\
\Z1 #\Zn Nächste Teilmahlzeit \Z1mit dem Barcodescanner\Zn erfassen\n\
\Z4<ESCAPE>\Zn Eingabe weiterer Teilmahlzeiten beenden, Summe dieser Mahlzeit berechnen\n\n" 0 0 2> 1.vge
stty cbreak -echo
modus=`dd bs=1 count=1 2>&-`
stty -cbreak echo
echo $modus >> asl.vge
vv1=`echo $modus | tr '\033' ':'`
if [ "${vv1}" = ":" ]
then
echo "bc-String: ${be_zwischensumme}" > summe.vge
summe=`echo "${be_zwischensumme}" | bc -l`
echo "Summe: ${summe}" >> summe.vge
summekomma=`echo ${summe} | sed 's/\./,/g'`
endsumme=`printf "%9.2f" $summekomma`
echo "Summekomma: ${endsumme}" >> summe.vge
echo "Z: ${datum} ${zeit} M Summe: ${endsumme}" >> ESM.TXT
aussenschleife="X"
fi
done
cp mahlzeiten.DTA mahlzeiten.vge
cat mahlzeiten.vge | sort | uniq > mahlzeiten.DTA
cp ESM.TXT ESM.vge
cat ESM.vge | uniq > ESM.TXT # Bisweilen werden gleiche Zeilen hintereinander mehrfach dargestellt ...
kwrite ESM.TXT
;;
"N") # Mahlzeiteneingabe nach mahlzeiten.DTA
dialog --colors --backtitle " \Z1DIABETESVERWALTUNGSPROGRAMM\Zn " --title \
" \Z1Eingabe von Mahlzeiten nach\Zn \Z4mahlzeiten.DTA\Zn " --inputbox "\nBitte geben Sie \
eine Mahlzeit ein, die Sie in \Z4mahlzeiten.DTA\Zn neu erfassen wollen. Abbruch: \Z4<RETURN>\Zn ohne Texteingabe\n \n" 11 80 2>mlz.vge
endstring=`cat mlz.vge`
laenge=${#endstring}
if [ $laenge -gt 2 ]
then
mlz=${endstring}
endstring="${endstring} "
endstring=${endstring:0:50} # Die Mahlzeit ist maximal 50 Zeichen lang.
bash calculatrice.sh
bewert=`cat loesung.vge`
bash getnum_be "${bewert}" # Vorgabe BE-Wert; das Ergebnis wird in zahl.vge gespeichert.
zzahl
grep "^${mlz}" mahlzeiten.DTA
resultat=$?
if [ $resultat -eq 0 ]
then
speise=`grep "^${mlz}" mahlzeiten.DTA`
endstring="${endstring}${zahl2}" # zahl2 ist das Ergebnis aus zzahl.
dialog --colors --backtitle " \Z1DIABETESVERWALTUNGSPROGRAMM\Zn " --title \
" \Z1Eingabe von Mahlzeiten nach\Zn \Z4mahlzeiten.DTA\Zn " \
--yesno "\Z1Mahlzeit schon in \Zn\Z4mahlzeiten.DTA\Zn \Z1gespeichert:\Zn\n\n\Z7\Zb${speise}\Zn\n\nWollen Sie die neue Mahlzeit \\
― \Z7\Zb${endstring}\Zn ― trotzdem speichern?\n\n"
ergebnis=$?
if [ $ergebnis = 0 ]
then
echo "${endstring}" >> mahlzeiten.DTA # Speicherung der Mahlzeit
cat mahlzeiten.DTA | sort > mzn.vge
cp mzn.vge mahlzeiten.DTA
kwrite mahlzeiten.DTA # Sicherheitshalber
fi
else
endstring="${endstring}${zahl2}" # zahl2 ist das Ergebnis aus zzahl.
echo "${endstring}" >> mahlzeiten.DTA
cat mahlzeiten.DTA | sort > mzn.vge
cp mzn.vge mahlzeiten.DTA
kwrite mahlzeiten.DTA # Sicherheitshalber
fi
fi
;;
"S") # Erzeugung svg-Datei aus ZU*.DTA
bash dia2svg.sh
;;
"T") # Texteingabe
datumundzeit
dialog --colors --backtitle " \Z1DIABETESVERWALTUNGSPROGRAMM\Zn " --title " Texteingabe " --inputbox "\nBitte geben Sie \
einen kommentierenden Text ein. Die Länge ist beliebig.\n \n" 11 80 2>text.vge
text=`cat text.vge`
echo "Z: ${datum} ${zeit} T ${text}" >> ESM.TXT
;;
"U") # Subjektiver Unterzucker
datumundzeit
text="Subjektiver Unterzucker"
dialog --colors --backtitle " \Z1DIABETESVERWALTUNGSPROGRAMM\Zn " --title " Unterzucker " --inputbox "\nBitte geben Sie \
einen kommentierenden Text ein. Die Länge ist beliebig.\n \n" 11 80 "${text}" 2>text.vge
text=`cat text.vge`
echo "Z: ${datum} ${zeit} T ${text}" >> ESM.TXT
;;
"W")
kwrite blutzuckermessgeraet.dta
;;
"Z")
datumundzeit
dialog --colors --backtitle " \Z1DIABETESVERWALTUNGSPROGRAMM\Zn " --title " Einnahme stark zuckerhaltiger \
Lebensmittel " --inputbox "\n\Z1\ZbZuckereinnahme zur Hypogykämiebekämpfung\Zn\n\n\
Bitte geben Sie ein, wie viele Stücke des stark zuckerhaltigen Lebensmittels (Dextroenergen o. Ä.) Sie eingenommen haben:\n \n" 14 120 2>traubenzucker1.vge
traubenzucker1=`cat traubenzucker1.vge` # Anzahl der Traubenzuckerstücke
dialog --colors --menu "Bitte wählen Sie nun das stark zuckerhaltige Lebensmittel aus, das Sie eingenommen haben:\n\n" 17 120 6 \
"A" "Dextroenergentraubenzucker\Z2quadrate\Zn" \
"B" "Dextroenergentraubenzucker\Z3würfel\Zn" \
"C" "Dextroenergentraubenzucker\Z4vierecken\Zn" \
"D" "Dextroenergentraubenrucker\Z5stangen\Zn" \
"E" "Geléebananen \Z6(ca. 1 BE/Stück)\Zn" \
"F" "Hobnobs \Z7\Zb(Co-op Edinburgh)\Zn" \
2>traubenzucker2.vge
traubenzucker2=`cat traubenzucker2.vge` # Art der Traubenzuckerstücke
case $traubenzucker2 in
"A")
traubenzucker3=0.48
;;
"B")
traubenzucker3=3.83
;;
"C")
traubenzucker3=0.28
;;
"D")
traubenzucker3=3.92
;;
"E")
traubenzucker3=0.92
;;
"F")
traubenzucker3=1.40
;;
esac
traubenzucker4=`echo $traubenzucker1 | sed 's/,/\./g'` # Für alle Fälle ein Dezimalpunkt ...
traubenzucker5=`echo "$traubenzucker4 * $traubenzucker3" | bc -l | sed 's/\./,/g'`
traubenzucker6=`printf "%5.2f" $traubenzucker5`
dialog --colors --msgbox "\nSie haben \Z1$traubenzucker5 BE\Zn eingenommen.\n\n" 0 0
echo "Z: ${datum} ${zeit} M Traubenzucker: ${traubenzucker6}" >> ESM.TXT
echo "Z: ${datum} ${zeit} M Summe: ${traubenzucker6}" >> ESM.TXT
;;
"R")
# "-61") # Datenübertragung # „Ü” ging plötzlich nicht mehr.
if [ "${bmg2}" = "A" ]
then
bash accu2dia.sh # Datenübertragung vom Accu-Chek-Gerät auf den Rechner
fi
if [ "${bmg2}" = "F" ]
then
bash freestylelibre.sh # Datenübertragung
bash freestylekurz.sh # Datenauswertung
bash dia2svg.sh # Erzeugung einer svg-Datei für den laufenden Tag
fi
;;
"X")
v6="X"
;;
*)
dialog --colors --backtitle " \Z1DIABETESVERWALTUNGSPROGRAMM\Zn " --title " \Z1Diab\
etesverwaltung\Zn " --infobox "\n\Z1Diabeteseingaben ― Art des ve\
rwendeten Insulins\Zn\n\n\
\Z1<RETURN>\Zn Humaloginsulin ― normale Injektion \Z0\Zb[I. E.]\Zn\n\
\Z1 I\Zn Humaloginsulin ― \Z1Injektion zur Korrektur\Zn \Z0\Zb[I. E.]\Zn\n\
\Z1 L\Zn Levemirinsulin \Z0\Zb[I. E.]\Zn\n\
\Z1 X\Zn Abbruch\n" 0 0
#./getkey > getkey_e.vge
#v7=`cat getkey_e.vge`
#v7=`echo $v7|tr "[:lower:]" "[:upper:]"`
stty cbreak -echo # aus lied
v7=`dd bs=1 count=1 2>&-`
stty -cbreak echo
echo "$v7" | tr '\033' ':'
v7=`echo "${v7}" | tr "[:lower:]" "[:upper:]"`
case $v7 in
"I") # --- Humaloginjektionen, zur Korrektur
datumundzeit
bash humalog 6 1 # I.-E.-Eingabe
zahl=`cat humalog.vge`
inj=`echo "${zahl}" | sed 's/\./,/g'`
v76=`printf "%5.1f" $inj`
string="Z: ${datum} ${zeit} I Humalog: ${v76} I. E."
echo "${string}" >> ESM.TXT
string="Z: ${datum} ${zeit} T Injektion zur Korrektur"
echo "${string}" >> ESM.TXT
;;
"L") # --- Levemirinjektionen
datumundzeit
bash levemir 6 1 # I.-E.-Eingabe
zahl=`cat levemir.vge`
inj=`echo "${zahl}" | sed 's/\./,/g'`
v76=`printf "%5.1f" $inj`
string="Z: ${datum} ${zeit} I Levemir: ${v76} I. E."
echo "${string}" >> ESM.TXT
;;
*) # --- Humaloginjektionen
datumundzeit
bash humalog 6 1 # I.-E.-Eingabe
zahl=`cat humalog.vge`
inj=`echo "${zahl}" | sed 's/\./,/g'`
v76=`printf "%5.1f" $inj`
string="Z: ${datum} ${zeit} I Humalog: ${v76} I. E."
tlstrg=${string:23:25}
if [ "${tlstrg}" != "I Humalog: 0,0 I. E." ]
then
echo "${string}" >> ESM.TXT
fi
dialog --colors --backtitle " \Z1DIABETESVERWALTUNGSPROGRAMM\Zn " \
--title " \Z1Diabetesverwaltung\Zn " --infobox "\n\Z1Diabeteseingaben ― \Z1\ZbKorrekturinsulin?\Zn\n\n\
\Z1<RETURN>\Zn Humaloginsulin ― normale Injektion \Z0\Zb[I. E.]\Zn\n\
\Z1 I\Zn Humaloginsulin ― \Z1\ZbInjektion zur Korrektur\Zn \Z0\Zb[I. E.]\Zn\n\n" 0 0
./getkey > getkey_k.vge
vk=`cat getkey_k.vge`
vk=`echo $vk|tr "[:lower:]" "[:upper:]"`
case $vk in
"I")
string="Z: ${datum} ${zeit} T Injektion zur Korrektur"
echo "${string}" >> ESM.TXT
;;
esac
;;
esac
;;
esac
done # Ende der Diabetesprogrammhauptschleife
|
Hoffentlich schimpft mich jetzt niemand, denn es sind über 700 Zeilen ...! Du hast weiter gefragt:
Und jetzt läuft es wieder Amok?
Seit dem Herunter- und Wiederherauffahren gestern Nachmittag nicht mehr.
Die Idee, Deine Datei unter neuem Namen zu speichern, sollte dazu dienen, den Fehler zu suchen, erst den der häufigen Aktualisierung, während neue Messwerte einlaufen - nicht als Dauerlösung.
Als gestern ständig die Zeile mit 0,0 I. E. Humalog angehängt wurde, geschah das sowohl zu einer Zeit, zu der ich mein Shellscript aufgerufen hatte als auch zu Zeiten, zu denen ich zwar in der Shell war, aber kein Shellscript aufgerufen worden war.
Wie oft wird die Datei denn mit den 0-Werten aktualisiert? Ist das regelmäßig? Halbwegs regelmäßig?
Merkwürdigerweise völlig unregelmäßig. Ich wäre froh, ich könnte irgendeine Systematik entdecken. Unsystematische Reaktionen habe ich auch bei einer ganz anderen Sache feststellen müssen: Ich möchte bei einem Menu, bei dem ich mit mehreren Buchstaben Auswahlmöglichkeiten haben möchte, nicht nach dem Buchstaben auch noch <RETURN> drücken müssen. In Nach http://openbook.rheinwerk-verlag.de/shell_programmierung/shell_007_002.htm habe ich eine Beschreibung entdeckt, wie man so etwas mit einem C-Programm machen kann, und ich habe es in meine Shellscripts eingebaut. In dem (übergeordneten) Shellscript assist.sh (das assistyz.sh aufruft) funktioniert es nach wie vor, bei assistyz.sh kam es ― für mich völlig unerwartet ― plötzlich zu Fehlermeldungen. Ich habe daraufhin das ganz alte Programm ...
| stty cbreak -echo
v6=`dd bs=1 count=1 2>&-`
stty -cbreak echo
echo $v6 | tr '\033' ':'
v6=`echo ${v6} | tr "[:lower:]" "[:upper:]"`
|
..., das ich vor vielen Jahren auch einmal im Internet gefunden hatte (ich weiß leider nicht mehr, wo) eingebaut. Danke für den Tipp mit den Backticks. Ich habe das auch schon im Internet gelesen, verwende sie aber einfach aus Gewohnheit weiter. Aber Du hast Recht, dass sie einfacher einzugeben sind. Ich werde mich da wohl umgewöhnen müssen. Für alle Hilfe vielen Dank und viele Grüße! Rhaban
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Nochmal ein Nachtrag:
Wenn Du einzelne Tastendrücke abfragen willst, kannst Du bei read die Leselänge auf 1 setzen, ganz ohne C: Dann geht er sofort nach dem 1. Zeichen weiter, ohne [Enter]. Wenn da irgendwer heimlich in Deine Datei schreibt, und Du willst wissen wer, dann kannst Du ja mal in einer 2. Konsole mit inotifywait gucken, wer das ist. Mir fällt auf, dass Du alles recht umständlich programmierst. Damit wird es natürlich unübersichtlicher als es sein müsste. (und entsprechend schwieriger zu entwanzen !)
LG, track
|
Rhaban
(Themenstarter)
Anmeldungsdatum: 25. Juni 2016
Beiträge: 469
Wohnort: München
|
Hallo, track, vielen Dank für Deine Nachricht von gestern Nacht! Danke für den Hinweis auf
Das wusste ich nicht, vereinfacht die Dinge aber stark. In den Linux-Shell-Büchern des Rheinwerkverlags (die ja auch im Internet zu finden sind, vgl. http://openbook.rheinwerk-verlag.de/), war nur das C-Programm zu finden. Danke auch für den Hinweis auf inotifywait. Auch das kannte ich nicht. Bis Di 15.08.2017 war ich in Edinburgh im Urlaub und hatte meinen Linuxrechner mit meinen Shellscripts mitgenommen. An den letzten drei Edinburgher Tagen und am ersten Tag hier in München ― Mi 16.08.2017 ― muss irgendjemand von Außen immer wieder Zeilen an die Datei ESM.TXT angehängt haben, ab da war Schweigen (und ich freue mich natürlich darüber). Sollte je wieder Sinnloses an die Datei angehängt werden, werde ich natürlich sofort mit inotifywait versuchen, herauszubekommen, wer das ist. Dass Diabetiker, die das Abbott-Freestyle-Libre-Lesegerät nutzen, riskieren, dass ihre Daten ungewollt auf einen Abbott-Server in den USA transferiert werden, bestätigt etwa http://www.insulinclub.de/index.php?page=Thread&threadID=26249&pageNo=2 Irgendjemand muss also ein (merkwürdiges) Interesse an meinen Blutzuckerwerten, an den Injektionen und den Mahlzeiten ... bekommen haben. Umso dankbarer bin ich, dass ich über das Ubuntuuserforum weiß, dass ich für die Zeit der Datenübertragung die Internetverbindung mit
trennen und danach mit
wieder herstellen kann. Viele Grüße! Rhaban
|