Schon vor Jahren(genauer Jahrzehnten) als sich mir die Gelegenheit auf einer DEC/VAX zu programmieren anbot, störten mich immer die Menü- und Bildschirmmasken, die zur Dateneingabe verwendet wurden. Diese waren teilweise schon recht komfortabel, aber abhängig von dem eingesetzten Hard/Software Terminal. Bei dem Standard-Terminal „BASH“ von Linux gab und gibt es recht schöne grafische Darstellungen von Menü- oder Daten-bildschirmen. Diese benutzen oft in C oder anderen Programmiersprachen geschriebene Libraries und Speicher zur Verwirklichung von Daten-Bildschirmdarstellungen.
Die heutige Entwicklung von ‚bash‘ sollte eigentlich genügend Möglichkeiten bieten, meine Ideen von einer einigermaßen komfortablen Bildschirmsteuerung ohne Libraries zu entwickeln. In C hatte ich diese Idee schon oft für die Scanner-Technologie der 80′ und 90′ Jahre entwickelt. Fakt war: Wenig Speicher, Bildschirmmasken nur mit den ASCII und sonst mußte alles selbst entwickelt werden.
Auch Heute bin ich zu meinem ‚Leidwesen‘ einer kleiner Freak. Ich will wissen bzw. verstehen wie ein Programm funktioniert. Auch in der Realisierung von Bash-Programmen gibt es sicherlich Lösungen für dieses und jenes Problem, den eingefleischten ‚Linuxianer‘ wird sicherlich mein Code ein Lächeln auf das Gesicht zaubern oder aber zum Ausruf bewegen: „Das geht doch eleganter… oder so und so muß das gemacht …“.
Darum geht es mir aber nicht bei meiner Codierung. Ich habe versucht mich an einige Konventionen zu halten, zwar nicht zu 100% aber ’naja‘ mindestens zu 75%, sodass ein normaler Programmierer oder ein auch Anfänger der Codierung folgen kann.
Das Projekt der Menü-und Bildschirm ist nicht 100%tig Fehler frei, aber es ermöglicht ein recht gutes und bequemes ‚Handling‘ von Bildschirmmasken.
Ich habe mehrere Möglichkeiten ausprobiert, diese hat den Reitz mit ’strings‘ und ‚arrays‘ zu spielen.
Was noch fehlt, ist die ausgeklügelte Datenübergabe (Schnittstelle) zu anderen Programmteile, ist zur Zeit hier nur ansatzweise verwirklicht.
Die praktische Anwendung bzw. Einsatz wird demnächst bei der Datenmaske meines Programmes ‚netlogon‚ (Thema: Mounten von Laufwerken im Netzwerk) erfolgen.
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 |
#!/bin/bash # # 10.01.2018 # # (c) Uwe von Royen # #----------------------------- # Programm für UvRNC #----------------------------- # Programm: versionsverwaltung # Filename: menue.sh # Version : 2.0.0 # Stand : 2018.05.13 #----------------------------- # include Dateien . global_var.inc . filename.inc . library_uvr.inc . logging.inc menue() { local func=${FUNCNAME[0]} #local wahl=$PS3 local _exit=0 local options="" local opt="" local opt_tmp="" logging 900 $func clear while [ true ] do printf "$MENUE_TITEL" printf "$CRLF" printf "$MENUE_TITEL_SUB" printf "$CRLF" printf "$CRLF" options=(" Projekt" " Verzeichnis" " Add" " Ende" ) select opt in "${options[@]}" do opt_tmp="${opt:2:3}" case $opt_tmp in "Pro") printf "+++ Projekt +++" maske_01 #sleep 3 break ;; "Ver") printf "+++ Sourcen-Verzeichnis +++" sleep 6 break ;; "Add") printf "+++ Hinzufügen in Versionsverwaltung +++" sleep 6 break ;; "End") exit=1 break ;; *) printf "Falsche Auswahl, nur Ziffern von 1 bis 4 sind erlaubt!" sleep 2 echo clear break ;; esac done if [ $exit -eq 1 ] then break fi clear done logging 999 $func } menue |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#!/bin/bash # # include: # library_uvr.inc # # --------------------------------- . mask_entry.inc . mask_draw.inc maske_01() #-------------------- { local func=${FUNCNAME[0]} logging 901 $func mask_01_draw mask_01_entry 6 logging 902 $func } |
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 |
#!/bin/bash # # include: # vvw_global_var.inc # # --------------------------------- # Globale Variablen in Grossbuchstaben MENUE_TITEL="**** [V]ersion[V]er[W]altung ****" MENUE_TITEL_SUB=" VVW " CRLF="\n" PS3=$(printf "\n Ihre Wahl: " ) WALL_Line="│" seperator_right_line="├" seperator_left_line="┤" _SPACE=" " _paces=" " _ROW=0 _COL=0 CHAR_LINE="─" CORNER_RIGHT_UP="┐" CORNER_LEFT_UP="┌" CORNER_RIGHT_DOWN="┘" CORNER_LEFT_DOWN="└" DIRECTION_D="DOWN" DIRECTION_U="UP" DUMMY="D" STEUERUNG=0 STEUERUNG_OBEN=13 STEUERUNG_UNTEN=2 STEUERUNG_LINKS=3 STEUERUNG_RECHTS=4 LEER_CHAR='░' KEY_BUFFERS="" KEY_BUFFER="" WAHR=0 FALSCH=1 ACTUAL_FIELD_NUMBER=0 EXIT_MASK=$falsch ExIT_FIELD=$falsch TOTAL_NUMBER_OF_FIELDS=0 declare -a CACHE_FIELD FIELD_01="ProjektName:" FIELD_VALUE_01="" FIELD_02="Verzeichnis:" FIELD_VALUE_02="" FIELD_03="DNS-Server:" FIELD_VALUE_03="" FIELD_04="DHCP:" FIELD_VALUE_04="" FIELD_05="IP-Adresse:" FIELD_VALUE_05="" FIELD_06="Alles korrekt[J/N]:" FIELD_VALUE_06="" FIELD_07="" FIELD_VALUE_07="" FIELD_08="" FIELD_VALUE_08="" FIELD_09="" FIELD_VALUE_09="" |
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 |
#!/bin/bash # # include: # mask_draw.inc # # --------------------------------- goto_xy_write() #------------ { local zeile_raw=$1 local spalte_col=$2 local line=$3$4$5$6$7$8$9 local line=$@ local anz=$# printf "\e[%d;%dH" $zeile_raw $spalte_col if [ -n "$line" ] then line="$1"; shift line="$1"; shift for (( tmp=1;$tmp<=($anz-2);tmp++ )) do line="$1"; shift if [ $tmp -lt $anz ] then printf "%s ""${line}" else #echo $anz printf "${line}" fi #printf "%s ""${line}" done fi } draw_line() #---------- { local tmp=0 local tmp_char=$3 local anz=$2 local line_enter=$1 local corner_right=$5 local corner_left=$4 local place=$6 for (( tmp=1;$tmp<=$line_enter;tmp++ )) do printf "$_SPACE" done if [ $corner_left != $DUMMY ] then if [ -n "$corner_left" ] then printf $corner_left else printf $WALL_Line fi fi for (( tmp=1;$tmp<=$anz;tmp++ )) do if [ -n $tmp_char ] then printf "$tmp_char" else printf "$_SPACE" fi done if [ $corner_right != $DUMMY ] then if [ -n "$corner_right" ] then printf $corner_right else printf $WALL_Line fi fi printf $CRLF } mask_01_draw() { clear draw_line 2 48 "$_SPACE" $DUMMY $DUMMY draw_line 2 48 $CHAR_LINE $CORNER_LEFT_UP $CORNER_RIGHT_UP draw_line 2 48 "$_SPACE" $WALL_Line $WALL_Line draw_line 2 48 "$_SPACE" $WALL_Line $WALL_Line draw_line 2 48 "$_SPACE" $WALL_Line $WALL_Line draw_line 2 48 "$_SPACE" $WALL_Line $WALL_Line draw_line 2 48 "$_SPACE" $WALL_Line $WALL_Line draw_line 2 48 "$_SPACE" $WALL_Line $WALL_Line draw_line 2 48 "$_SPACE" $WALL_Line $WALL_Line draw_line 2 48 "$_SPACE" $WALL_Line $WALL_Line draw_line 2 48 "$_SPACE" $WALL_Line $WALL_Line draw_line 2 48 "$_SPACE" $WALL_Line $WALL_Line draw_line 2 48 "$_SPACE" $WALL_Line $WALL_Line draw_line 2 48 "$_SPACE" $WALL_Line $WALL_Line draw_line 2 48 $CHAR_LINE $CORNER_LEFT_DOWN $CORNER_RIGHT_DOWN goto_xy_write 3 12 "VersionsVerWaltung_Vers._1.0" goto_xy_write 5 4 $FIELD_01 goto_xy_write 6 4 $FIELD_02 goto_xy_write 7 4 $FIELD_03 goto_xy_write 8 4 $FIELD_04 goto_xy_write 9 4 $FIELD_05 goto_xy_write 14 4 $FIELD_06 #---------------------------------------------------------- TOTAL_NUMBER_OF_FIELDS=6 } |
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 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 |
#!/bin/bash # # include: # mask_entry.inc # pos_x_y() #-------- { local z=$1 local s=$2 echo -en "\033["$z";"$s"H" } check_key() #---------- { local key=$KEY_BUFFER KEY_POS_X=$1 KEY_POS_Y=$2 KEY_COUNTER=$3 case "$key" in $'\x7f') # Backspace #exit return 8 ;; $'\x1b\x5b\x32\x7e') # Insert #echo Insert Key return 48 ;; $'\x1b\x5b\x33\x7e') # Del #echo Insert Key return 49 ;; $'\x1b\x5b\x41') # Up_arrow / oben #echo Up arrow return 41 ;; $'\x1b\x5b\x42') # Down_arrow / unten #echo Down arrow return 13 ;; $'\x1b\x5b\x43') # Right_arrow #echo Right arrow return 43 ;; $'\x1b\x5b\x44') # Left_arrow #echo Left arrow return 44 ;; $'\x0a') # Enter #echo Enter Key return 13 ;; $'\x20') # Space #echo "Space Key" return 20 ;; $'\x09') # Tab #echo TAB return 99 ;; $'\x1b') # Escape return 27 ;; esac return 0 } get_key() #--------- { local return_value KEY_BUFFER="" unset K1 K2 K3 # -sn1 read -s -N1 -p '' K1="$REPLY" read -s -N2 -t 0.003 K2="$REPLY" read -s -N1 -t 0.003 K3="$REPLY" KEY_BUFFER="$K1$K2$K3" check_key return_value=$? case "$return_value" in 0) # Normal Keys return 0 ;; 8) # Backspace return 8 break ;; 27) #ESC return 27 break ;; 13) # Return return 13 break ;; 20) # Space KEY_BUFFER=$LEER_CHAR return 0 ;; 41) # Up_arrow / oben return 41 break ;; 43) # Righ #KEY_BUFFER=$LEER_CHAR return 43 #return 0 break ;; 44) # Left return 44 break ;; 48) # Insert #KEY_BUFFER=$LEER_CHAR return 48 break ;; 49) # Delet #KEY_BUFFER=$LEER_CHAR return 49 break ;; 99) # Muellkorb Keys return 99 break ;; esac } write_to_cache_field() #--------------------- { #printf "|"$1"|" CACHE_FIELD[$1]=$1":"$KEY_BUFFERS #printf ${CACHE_FIELD[$1]} } read_from_cache_buffer() { local buffer=$1 local tmp tmp=${CACHE_FIELD[${buffer:7:1}]} tmp=${tmp:2:(${#tmp})} echo $tmp } row_clear() { local row_length local i local z #zeile local s #spalte local co_z # co-faktor local co_s # co-faktor row_length=$1 z=$2 s=$3 co_z=0 co_s=0 printf "\e[%d;%dH" $((z+co_z)) $((s+co_s)) i=1 # oder einfach nur $((row_length)): (($i;i<=$((row_length+1));i++)) for (($i;i<$((row_length+1));i++)) do printf " " done } build_row() #------------ { local row_length local i local z #zeile local s #spalte local co_z # co-faktor für Bildschirm printf local co_s # co-faktor für Bildschirm printf local co_pos_x # co-faktor für Cursor_POS local co_pos_y # co-faktor für Cursor_POS local line line="${1}" #linie=$1 row_length=$2 z=$3 s=$4 co_z=$5 co_s=$6 co_pos_z=$7 co_pos_s=$8 printf "\e[%d;%dH" $((z+co_z)) $((s+co_s)) printf $line pos_x_y $((z+co_pos_z)) $((s+co_pos_s)) } set_counter_and_spalten() { local _i=$1 local _s=$2 local dec local inc local w=0 local x=$3 if [ "$x" = "+" ] then _i=$(( _i+1)) #_s=$(( _s+1)) w=1 fi if [ "$x" = "-" ] then _i=$(( _i-1)) #_s=$(( _s-1)) w=1 fi if [ "$x" = "++" ] then #_i=$(( _i+1)) _s=$(( _s+1)) w=2 fi if [ "$x" = "--" ] then #_i=$(( _i-1)) _s=$(( _s-1)) w=2 fi if (( $w == 1 )) then echo $_i fi if (( $w == 2 )) then echo $_s fi } goto_xy_input() #------------- { local zeile #ok local spalte #ok local input_length #ok local input_field #ok -> FIELD-xx Name local anz_chars #ok local input_buffer local return_value local return_field local i local co_1=1 local ii local jump=$WAHR local memo_s local memo_s local tmp local string_tmp local del_pos local ins_pos local mask_leave zeile=$1 memo_z=$zeile spalte=$2 memo_s=$spalte input_length=$3 input_field=$4 mask_leave=$5 anz_chars=$input_length EXIT_FIELD=$FALSCH tmp="$(read_from_cache_buffer $input_field)" while [ $EXIT_FIELD = $FALSCH ] #- Schleife für FIELD-xx -# do ii=1 for (($ii;ii<$((anz_chars+1));ii++)) do printf " " done input_buffer=$tmp #if (( ${#tmp} > 0 )) #then # echo "***" #else # echo " " #fi # Einlesen von schon angesprungenem Feld! # Tip : read_from_cache_buffer ii=1 for (( $ii;ii<=${#tmp};ii++ )) do input_buffer[ii]=${tmp:$((ii-1)):1} done i=1 for (( $i;i<=${anz_chars};i++ )) do pos_x_y $zeile $spalte get_key return_value=$? # Eingabe Regulärer Tasten -> ok if (( $return_value == 0 )) then input_buffer[i]=$KEY_BUFFER # Array Concatenon! #input_buffer+=( "${input_buffer[0]}" ) build_row "${input_buffer[i]}" $((${#input_buffer[i]})) $memo_z $spalte 0 0 0 0 spalte=$((spalte+1)) KEY_BUFFER="" if (( ${#input_buffer[@]} >= $anz_chars )) then jump=$FALSCH else jump=$WAHR fi pos_x_y $zeile $spalte else # --------------------------- if (( $return_value == 8 )) # Backspace # --------------------------- then KEY_BUFFER="" jump=$FALSCH #!ganz wichtig i=$((i-2)) spalte=$((spalte-1)) string_tmp="" # wichtig! #------------------ # array_to_string #------------------ ii=1 for (($ii;ii<=$anz_chars;ii++)) do string_tmp=$string_tmp${input_buffer[ii]} done # Bestimmung des Loeschobjektes del_pos=$i if (( $del_pos >= 0 )) then # loeschen links des Cursors #string_tmp=${string_tmp:0:$del_pos}${string_tmp:${#string_tmp}} string_tmp=${string_tmp:0:$((del_pos))}${string_tmp:$((del_pos+1)):$anz_chars} fi row_clear $anz_chars $memo_z $memo_s build_row $string_tmp ${#string_tmp} $memo_z $memo_s # string_to_array #------------------ ii=1 unset input_buffer #input_buffer=$string_tmp for (( $ii;ii<=${#string_tmp};ii++ )) do input_buffer[ii]=${string_tmp:$((ii-1)):1} done if (( i<=0 )) then i=0 spalte=$memo_s fi string_tmp="" fi # --------------------------- if (( $return_value == 13 )) # return / down # --------------------------- then KEY_BUFFER="" jump=$FALSCH #!ganz wichtig break fi # --------------------------- if (( $return_value == 27 )) # ESC # --------------------------- then KEY_BUFFER="" input_buffer="" string_tmp="" tmp="" i=1 jump=$FALSCH #!ganz wichtig KEY_BUFFERS="" row_clear $anz_chars $memo_z $memo_s unset input_buffer spalte=$memo_s break fi # --------------------------- if (( $return_value == 41 )) # up # --------------------------- then KEY_BUFFER="" STEUERUNG=$STEUERUNG_OBEN jump=$FALSCH #!ganz wichtig break fi # --------------------------- if (( $return_value == 43 )) # rechts # --------------------------- then KEY_BUFFER="" jump=$WAHR #!ganz wichtig if (( $i >= $anz_chars )) then i=$((anz_chars-1)) spalte=$((spalte-1)) fi spalte=$((spalte+1)) fi # --------------------------- if (($return_value == 44 )) # links # --------------------------- then KEY_BUFFER="" jump=$WAHR #!ganz wichtig i=$((i-2)) spalte=$((spalte-1)) if (( i<=0 )) then i=0 spalte=$memo_s fi fi # --------------------------- if (( $return_value == 48 )) # insert # --------------------------- then KEY_BUFFER=$LEER_CHAR string_tmp='' jump=$FALSCH #!ganz wichtig #------------------ # array_to_string #------------------ ii=1 for (($ii;ii<=$anz_chars;ii++)) do string_tmp=$string_tmp${input_buffer[ii]} done #---------------------------------------------------------------------- # position wo eingefügt wird, string nach links, fuegt leerzeichen ein #---------------------------------------------------------------------- ins_pos=$i string_tmp=${string_tmp:0:((ins_pos-1))}$KEY_BUFFER${string_tmp:((ins_pos-1)):$anz_chars} row_clear $anz_chars $memo_z $memo_s build_row $string_tmp ${#string_tmp} $memo_z $memo_s #i=$((ins_pos-1)) #------------------ # string_to_array #------------------ ii=1 unset input_buffer #input_buffer=$string_tmp for (( $ii;ii<=${#string_tmp};ii++ )) do input_buffer[ii]=${string_tmp:$((ii-1)):1} done #i=$((i+1)) spalte=$((spalte+1)) fi # --------------------------- if (( $return_value == 49 )) # Del # --------------------------- then jump=$FALSCH #!ganz wichtig string_tmp="" KEY_BUFFER="" if (( $i > 0 )) then unset input_buffer[i] #------------------ # array_to_string #------------------ ii=1 for (($ii;ii<=$anz_chars;ii++)) do string_tmp=$string_tmp${input_buffer[ii]} done i=$((i-1)) row_clear $anz_chars $memo_z $memo_s printf "\e[%d;%dH" $memo_z $memo_s build_row $string_tmp ${#string_tmp} $memo_z $memo_s #------------------ # string_to_array #------------------ ii=1 unset input_buffer #input_buffer=$string_tmp for (( $ii;ii<=${#string_tmp};ii++ )) do input_buffer[ii]=${string_tmp:$((ii-1)):1} done fi string_tmp="" fi # --------------------------- if (( $return_value == 99 )) # TastaturMüll # --------------------------- then KEY_BUFFER="" jump=$WAHR #!ganz wichtig printf "\e[%d;%dH" 20 15 #$memo_z $memo_s printf "i:"$i if (( $i > 0 )) then i=$((i-1)) printf "\e[%d;%dH" 21 15 #$memo_z $memo_s printf "i:"$i fi break fi fi pos_x_y $zeile $spalte done if (( $jump == $FALSCH )) && (( ${#input_buffer[@]} != 0 )) then zeile=$memo_z spalte=$memo_s #KEY_BUFFERS="" for (( ii=1;ii<=$anz_chars;ii++ )) # -- array -> string --# do KEY_BUFFERS=$KEY_BUFFERS${input_buffer[ii]} done printf "\e[%d;%dH" $zeile $spalte if (( ${#KEY_BUFFERS} > 0 )) then #printf "${KEY_BUFFERS,,}" # nur nach Wunsch! printf $KEY_BUFFERS if (( ${#mask_leave} > 0 )) then if [ "${KEY_BUFFERS,,}" == "ja" ] || [ "${KEY_BUFFERS,,}" == "yes" ] then EXIT_FIELD=$WAHR EXIT_MASK=$WAHR break else row_clear $anz_chars $memo_z $memo_s fi fi #echo $KEY_BUFFERS >> test.daten #echo $input_field":"$KEY_BUFFERS >> config.daten write_to_cache_field ${input_field:7:1} fi fi jump=$FALSCH unset input_buffer if (( $return_value != 27 )) then EXIT_FIELD=$WAHR fi done } mask_01_entry() #-------------- { local anz_fields=$1 #local ok_field=$2 local field_txt_length local field_input_length #local input_field=$3 local z local s local i local tmp ACTUAL_FIELD_NUMBER=0 EXIT_MASK=$FALSCH EXIT_FIELD=$FALSCH echo -n > config.daten while [ $EXIT_MASK = $FALSCH ] #- Schleife für totale Maske -# do for (( i=1;i<=$anz_fields;i++ )) #-- Maske --# do if (( $STEUERUNG == $STEUERUNG_OBEN )) then i=$((i-2)) STEUERUNG=0 # zurücksetzen auf Startwert fi ACTUAL_FIELD_NUMBER=$i case $ACTUAL_FIELD_NUMBER in 1) # FIELD_01 KEY_BUFFERS="" field_text_length=${#FIELD_01} z=5 s=4 s=$((s+field_text_length+1)) field_input_length=15 tmp="FIELD_0"$ACTUAL_FIELD_NUMBER goto_xy_input $z $s $field_input_length ${tmp} EXIT_MASK=$FALSCH #ACTUAL_FIELD_NUMBER=$((ACTUAL_FIELD_NUMBER+1)) ;; 2) # FIELD_02 KEY_BUFFERS="" field_text_length=${#FIELD_02} z=6 s=4 s=$((s+field_text_length+1)) field_input_length=5 tmp="FIELD_0"$ACTUAL_FIELD_NUMBER goto_xy_input $z $s $field_input_length ${tmp} EXIT_MASK=$FALSCH #ACTUAL_FIELD_NUMBER=$((ACTUAL_FIELD_NUMBER+1)) ;; 3) # FIELD_03 KEY_BUFFERS="" field_text_length=${#FIELD_03} z=7 s=4 s=$((s+field_text_length+1)) field_input_length=5 tmp="FIELD_0"$ACTUAL_FIELD_NUMBER goto_xy_input $z $s $field_input_length ${tmp} EXIT_MASK=$FALSCH #ACTUAL_FIELD_NUMBER=$((ACTUAL_FIELD_NUMBER+1)) ;; 4) # FIELD_04 KEY_BUFFERS="" field_text_length=${#FIELD_04} z=8 s=4 s=$((s+field_text_length+1)) field_input_length=5 tmp="FIELD_0"$ACTUAL_FIELD_NUMBER goto_xy_input $z $s $field_input_length ${tmp} EXIT_MASK=$FALSCH #ACTUAL_FIELD_NUMBER=$((ACTUAL_FIELD_NUMBER+1)) ;; 5) # FIELD_05 KEY_BUFFERS="" field_text_length=${#FIELD_05} z=9 s=4 s=$((s+field_text_length+1)) field_input_length=5 tmp="FIELD_0"$ACTUAL_FIELD_NUMBER goto_xy_input $z $s $field_input_length ${tmp} EXIT_MASK=$FALSCH #ACTUAL_FIELD_NUMBER=$((ACTUAL_FIELD_NUMBER+1)) ;; 6) # FIELD_06 KEY_BUFFERS="" field_text_length=${#FIELD_06} z=14 s=4 s=$((s+field_text_length+1)) field_input_length=3 tmp="FIELD_0"$ACTUAL_FIELD_NUMBER goto_xy_input $z $s $field_input_length ${tmp} "Frage_J_N" # EXIT_MASK=$FALSCH # Remarken wenn es nicht die J/N abfrage ist! ;; esac done done unset KEY_BUFFERS unset KEY_BUFFER } |
Hier die gezippte Version: menue_masken_bash.zip