rMenu.sh 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. #!/bin/bash
  2. trap 'echo -en "\ec"; stty sane; exit' SIGINT
  3. aa=0
  4. ab=0
  5. A(){ for b in $(seq 0 28);do E${b};done; for b in $(seq 0 9);do F${b};done; }
  6. B()
  7. {
  8. local c
  9. IFS= read -s -n1 c 2>/dev/null >&2
  10. if [[ $c = $(echo -en "\e") ]]; then
  11. read -s -n1 c 2>/dev/null >&2
  12. if [[ $c = \[ ]]; then
  13. read -s -n1 c 2>/dev/null >&2
  14. case $c in
  15. A) echo d ;;
  16. B) echo e ;;
  17. C) echo f ;;
  18. D) echo g ;;
  19. esac
  20. fi
  21. elif [[ "$c" == "$(echo -en \\x0A)" ]]; then
  22. echo enter
  23. fi
  24. }
  25. C()
  26. {
  27. if [[ $i == d ]];then ((aa--));fi
  28. if [[ $i == e ]];then ((aa++));fi
  29. if [[ $aa -lt 0 ]];then aa=28;fi
  30. if [[ $aa -gt 28 ]];then aa=0;fi;
  31. if [[ $i == g ]];then ((ab--));fi
  32. if [[ $i == f ]];then ((ab++));fi
  33. if [[ $ab -lt 0 ]];then ab=9;fi
  34. if [[ $ab -gt 9 ]];then ab=0;fi;
  35. }
  36. D()
  37. {
  38. j1=$((aa+1)); k1=$((aa-1))
  39. if [[ $k1 -lt 0 ]];then k1=28;fi
  40. if [[ $j1 -gt 28 ]];then j1=0;fi
  41. if [[ $aa -lt $aa ]];then echo -en "\e[0m";E$k1;else echo -en "\e[0m";E$j1;fi
  42. if [[ $j1 -eq 0 ]] || [ $k1 -eq 28 ];then
  43. echo -en "\e[0m" ; E$k1; E$j1;fi;echo -en "\e[0m";E$k1;E$j1;
  44. j2=$((ab+1)); k2=$((ab-1))
  45. if [[ $k2 -lt 0 ]];then k2=9;fi
  46. if [[ $j2 -gt 9 ]];then j2=0;fi
  47. if [[ $ab -lt $ab ]];then echo -en "\e[0m";F$k2;else echo -en "\e[0m";F$j2;fi
  48. if [[ $j2 -eq 0 ]] || [ $k2 -eq 9 ];then
  49. echo -en "\e[0m" ; F$k2; F$j2;fi;echo -en "\e[0m";F$k2;F$j2;
  50. }
  51. TXa()
  52. {
  53. for (( a=2; a<=38; a++ ))
  54. do
  55. echo -e "\e[${a};1H\e[34m\xE2\x94\x82 \xE2\x94\x82\e[0m"
  56. done
  57. echo -en "\e[1;1H\e[34m┌────────────────────────────────────────────────────────────────────────────────┐\e[0m";
  58. echo -en "\e[2;2H\e[1;35m *** ***\e[0m";
  59. echo -en "\e[3;1H\e[34m├────────────────────────────────────────────────────────────────────────────────┤\e[0m";
  60. echo -en "\e[4;2H\e[2m коментарий\e[0m";
  61. echo -en "\e[5;1H\e[34m├────────────────────────────────────────────────────────────────────────────────┤\e[0m";
  62. echo -en "\e[15;1H\e[34m├────────────────────────────────────────────────────────────────────────────────┤\e[0m";
  63. echo -en "\e[17;1H\e[34m├─ \xE2\x86\x90 Left ─── \xE2\x86\x92 Right ─── \xe2\x86\xb2 Select Enter ────────────────────────────────────────┤\e[0m";
  64. echo -en "\e[35;1H\e[34m├────────────────────────────────────────────────────────────────────────────────┤\e[0m";
  65. echo -en "\e[37;1H\e[34m├─ \xE2\x86\x91 Up ───── \xE2\x86\x93 Down ──── \xe2\x86\xb2 Select Enter ────────────────────────────────────────┤\e[0m";
  66. echo -en "\e[39;1H\e[34m└────────────────────────────────────────────────────────────────────────────────┘\e[0m";
  67. }
  68. E0(){ echo -en "\e[6;2H Установка \e[32m INSTALL \e[0m";}
  69. E1(){ echo -en "\e[7;2H Kраткий обзор \e[32m SYNOPSIS \e[0m";}
  70. E2(){ echo -en "\e[8;2H Описание \e[32m DESCRIPTION \e[0m";}
  71. E3(){ echo -en "\e[9;2H Смотрите также \e[32m AUTHOR \e[0m";}
  72. E4(){ echo -en "\e[10;2H \e[32m \e[0m";}
  73. E5(){ echo -en "\e[11;2H \e[32m \e[0m";}
  74. E6(){ echo -en "\e[12;2H \e[32m \e[0m";}
  75. E7(){ echo -en "\e[13;2H \e[32m \e[0m";}
  76. E8(){ echo -en "\e[14;2H \e[32m \e[0m";}
  77. E9(){ echo -en "\e[16;2H\e[34m [ Go ]\e[0m";}
  78. F0(){ echo -en "\e[16;11H[ A ]";}
  79. F1(){ echo -en "\e[16;18H[ B ]";}
  80. F2(){ echo -en "\e[16;25H[ C ]";}
  81. F3(){ echo -en "\e[16;32H[ D ]";}
  82. F4(){ echo -en "\e[16;39H[ E ]";}
  83. F5(){ echo -en "\e[16;46H[ F ]";}
  84. F6(){ echo -en "\e[16;53H[ G ]";}
  85. F7(){ echo -en "\e[16;60H[ H ]";}
  86. F8(){ echo -en "\e[16;67H[ I ]";}
  87. F9(){ echo -en "\e[16;74H\e[34m[Exit]\e[0m";}
  88. E10(){ echo -en "\e[18;2H \e[32m \e[0m";}
  89. E11(){ echo -en "\e[19;2H \e[32m \e[0m";}
  90. E12(){ echo -en "\e[20;2H \e[32m \e[0m";}
  91. E13(){ echo -en "\e[21;2H \e[32m \e[0m";}
  92. E14(){ echo -en "\e[22;2H \e[32m \e[0m";}
  93. E15(){ echo -en "\e[23;2H \e[32m \e[0m";}
  94. E16(){ echo -en "\e[24;2H \e[32m \e[0m";}
  95. E17(){ echo -en "\e[25;2H \e[32m \e[0m";}
  96. E18(){ echo -en "\e[26;2H \e[32m \e[0m";}
  97. E19(){ echo -en "\e[27;2H \e[32m \e[0m";}
  98. E20(){ echo -en "\e[28;2H \e[32m \e[0m";}
  99. E21(){ echo -en "\e[29;2H \e[32m \e[0m";}
  100. E22(){ echo -en "\e[30;2H \e[32m \e[0m";}
  101. E23(){ echo -en "\e[31;2H \e[32m \e[0m";}
  102. E24(){ echo -en "\e[32;2H \e[32m \e[0m";}
  103. E25(){ echo -en "\e[33;2H \e[32m \e[0m";}
  104. E26(){ echo -en "\e[34;2H \e[32m \e[0m";}
  105. E27(){ echo -en "\e[36;2H Grannik \e[32m Git \e[0m";}
  106. E28(){ echo -en "\e[38;2H \e[34m Exit \e[0m";}
  107. INI(){ echo -en "\ec" ;stty sane;TXa;A; };INI
  108. WILa()
  109. {
  110. INI
  111. while [[ "$l2" != " " ]]; do case $ab in
  112. 0)D;echo -en "\e[1;32m"; (F0);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e " 0";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  113. 1)D;echo -en "\e[1;32m"; (F1);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e " 1";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  114. 2)D;echo -en "\e[1;32m"; (F2);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e " 2";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  115. 3)D;echo -en "\e[1;32m"; (F3);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e " 3";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  116. 4)D;echo -en "\e[1;32m"; (F4);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e " 4";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  117. 5)D;echo -en "\e[1;32m"; (F5);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e " 5";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  118. 6)D;echo -en "\e[1;32m"; (F6);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e " 6";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  119. 7)D;echo -en "\e[1;32m"; (F7);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e " 7";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  120. 8)D;echo -en "\e[1;32m"; (F8);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e " 8";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  121. 9)D;echo -en "\e[1;32m"; (F9);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;break;fi;;
  122. esac;C;done
  123. }
  124. WILb()
  125. {
  126. while [[ "$l1" != " " ]]; do case $aa in
  127. 0)D;echo -en "\e[1;37m"; (E0);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e " 0";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  128. 1)D;echo -en "\e[1;37m"; (E1);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e " 1";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  129. 2)D;echo -en "\e[1;37m"; (E2);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e " 2";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  130. 3)D;echo -en "\e[1;37m"; (E3);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e " 3";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  131. 4)D;echo -en "\e[1;37m"; (E4);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e " 4";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  132. 5)D;echo -en "\e[1;37m"; (E5);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e " 5";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  133. 6)D;echo -en "\e[1;37m"; (E6);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e " 6";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  134. 7)D;echo -en "\e[1;37m"; (E7);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e " 7";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  135. 8)D;echo -en "\e[1;37m"; (E8);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e " 9";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  136. 9)D;echo -en "\e[1;37m"; (E9);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;WILa;INI;fi;;
  137. 10)D;echo -en "\e[1;37m";(E10);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e "10";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  138. 11)D;echo -en "\e[1;37m";(E11);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e "11";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  139. 12)D;echo -en "\e[1;37m";(E12);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e "12";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  140. 13)D;echo -en "\e[1;37m";(E13);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e "13";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  141. 14)D;echo -en "\e[1;37m";(E14);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e "14";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  142. 15)D;echo -en "\e[1;37m";(E15);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e "15";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  143. 16)D;echo -en "\e[1;37m";(E16);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e "16";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  144. 17)D;echo -en "\e[1;37m";(E17);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e "17";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  145. 18)D;echo -en "\e[1;37m";(E18);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e "18";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  146. 19)D;echo -en "\e[1;37m";(E19);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e "19";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  147. 20)D;echo -en "\e[1;37m";(E20);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e "20";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  148. 21)D;echo -en "\e[1;37m";(E21);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e "21";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  149. 22)D;echo -en "\e[1;37m";(E22);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e "22";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  150. 23)D;echo -en "\e[1;37m";(E23);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e "23";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  151. 24)D;echo -en "\e[1;37m";(E24);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e "24";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  152. 25)D;echo -en "\e[1;37m";(E25);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e "25";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  153. 26)D;echo -en "\e[1;37m";(E26);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e "26";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  154. 27)D;echo -en "\e[1;37m";(E27);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;echo -e "
  155. Mo 11 Sep 2023 20:10:28
  156. rMenu Основательно и авторски переписанное мной меню на языке bash для Linux OS терминала, с добавлением горизонтального меню к вертикальному,
  157. что создает возможность писать и использовать меню в 3-х координатах x y z.
  158. asciinema: \e[34m https://asciinema.org/a/607402\e[0m
  159. github \e[34m https://github.com/Grannik/rMenu\e[0m
  160. gitlab \e[34m https://gitlab.com/grannik/rmenu\e[0m
  161. codeberg \e[34m https://codeberg.org/Grannik/rMenu\e[0m
  162. sourceforge:\e[34m https://sourceforge.net/projects/rmenu/files/\e[0m
  163. ";echo -en "\e[1;34m ENTER = main menu ";read;INI;fi;;
  164. 28)D;echo -en "\e[1;37m";(E28);i=`B`;if [[ $i == enter ]];then echo -en "\ec";stty sane;exit 0;fi;;
  165. esac;C;done
  166. }
  167. WILb
  168. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  169. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *** Commentary *** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  170. # - trap установка обработчика сигнала SIGINT для комбинации клавиш Ctrl+C
  171. # ----------------------- Глобальные переменные --------------------------
  172. # aa отслеживает, какой из шагов в первом меню в данный момент является активным, позволяя скрипту реагировать на ввод для изменения текущего активного шага.
  173. # ab отслеживает, какой из шагов во вторм меню в данный момент является активным, позволяя скрипту реагировать на ввод для изменения текущего активного шага.
  174. # ----------------------- Локальные переменные --------------------------
  175. # a переменная цикла рамки текста
  176. # b это переменная, которая используются в циклах для итерации.
  177. # c переменная используется для хранения символов, считанных с клавиатуры.
  178. # d стрелка вверх.
  179. # e стрелка вниз.
  180. # f стрелка вправо
  181. # g стрелка влево
  182. # i обработчик курсора
  183. # ----------------------- Локальные ветвящиеся переменные ----------------
  184. # j1 j2 ... переменная служит для хранения индекса следующего шага относительно текущего активного шага.
  185. # k1 k2 ... переменная служит для хранения индекса предыдущего шага относительно текущего активного шага.
  186. # l1 l2 проверяет условие, что значение переменной la не равно пробелу. Этот цикл будет выполняться, пока la не станет равным пробелу.
  187. # ---------------------- Функции -----------------------------------------
  188. # A() функция отвечает за последовательный вызов функций E0, E1, ..., E + 28 Количество вызовов функций зависит от значения 28
  189. # B() функция предназначена для обработки ввода с клавиатуры, особенно при использовании ANSI escape-последовательностей, она может вернуть значения ca da enter
  190. # C() функция в скрипте служит для обработки ввода пользователя и изменения текущего активного шага в меню.
  191. # D() функция осуществляет действия, связанные с обработкой aa j1 k1 и выводом ANSI escape-последовательностей для управления отображением в терминале.
  192. # TXa() функция создает варианнт текстового оформления a
  193. # E0() - ... начиная с E группа функций использует ANSI escape-последовательности для управления позицией курсора и установки цвета текста.
  194. # E0() - E28() основная группа функций использует ANSI escape-последовательности для управления позицией курсора и установки цвета текста.
  195. # F0() - F9() дополнительная группа функций использует ANSI escape-последовательности для управления позицией курсора и установки цвета текста.
  196. # INI Эта функция INI() выполняет инициализацию интерфейса. Ниже нельза переносить.
  197. # WILa() функция первого основного цикла
  198. # WILb() функция второго дополнительного цикла
  199. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~