Сценарий оболочки для создания меню [duplicate]

Для более старых версий сетевого менеджера (& lt; 0.9) вы можете редактировать

/usr/share/dbus-1/system-services/fi.epitest.hostap.WPASupplicant.service

В версии 0.9 файл изменился на fi.w1.wpa_supplicant1.service, поэтому теперь вам нужно отредактировать [!d1 ]

/usr/share/dbus-1/system-services/fi.w1.wpa_supplicant1.service

Файл должен выглядеть так:

[D-BUS Service]
Name=fi.w1.wpa_supplicant1
Exec=/sbin/wpa_supplicant -u -s -O /var/run/wpa_supplicant
User=root

И вы можете добавить свои параметры в строку Exec. Чтобы network-manager перезапустить wpa_supplicant, запустите

ps aux | grep wpa

и убейте процесс wpa_supplicant

kill -9 12345

Он начнет резервное копирование автоматически.

101
задан 13 December 2017 в 20:35

20 ответов

Используя dialog, команда будет выглядеть так:

dialog --clear --backtitle "Backtitle here" --title "Title here" --menu "Choose one of the following options:" 15 40 4 \ 1 "Option 1" \ 2 "Option 2" \ 3 "Option 3"

dialog

Поместить его в скрипт:

#!/bin/bash HEIGHT=15 WIDTH=40 CHOICE_HEIGHT=4 BACKTITLE="Backtitle here" TITLE="Title here" MENU="Choose one of the following options:" OPTIONS=(1 "Option 1" 2 "Option 2" 3 "Option 3") CHOICE=$(dialog --clear \ --backtitle "$BACKTITLE" \ --title "$TITLE" \ --menu "$MENU" \ $HEIGHT $WIDTH $CHOICE_HEIGHT \ "${OPTIONS[@]}" \ 2>&1 >/dev/tty) clear case $CHOICE in 1) echo "You chose Option 1" ;; 2) echo "You chose Option 2" ;; 3) echo "You chose Option 3" ;; esac
33
ответ дан 18 July 2018 в 04:04

В ответе serverfault уже есть тот же вопрос. В этом решении используется whiptail.

2
ответ дан 18 July 2018 в 04:04
#!/bin/bash # Bash Menu Script Example PS3='Please enter your choice: ' options=("Option 1" "Option 2" "Option 3" "Quit") select opt in "${options[@]}" do case $opt in "Option 1") echo "you chose choice 1" ;; "Option 2") echo "you chose choice 2" ;; "Option 3") echo "you chose choice $REPLY which is $opt" ;; "Quit") break ;; *) echo "invalid option $REPLY";; esac done

Добавьте break инструкции, где вам понадобится цикл select для выхода. Если break не выполняется, оператор select зацикливается, и меню снова отображается.

В третьем варианте я включил переменные, заданные оператором select, чтобы продемонстрировать, что у вас есть доступ к этим значениям. Если вы выберете его, он выведет:

you chose choice 3 which is Option 3

Вы можете видеть, что $REPLY содержит строку, введенную в командной строке. Он используется как индекс в массиве ${options[@]}, как если бы массив был основан на 1. Переменная $opt содержит строку из этого индекса в массиве.

Обратите внимание, что выбор может быть простым списком непосредственно в инструкции select следующим образом:

select opt in foo bar baz 'multi word choice'

, но вы не можете поместить такой список в скалярную переменную из-за пробелов в одном из вариантов.

Вы также можете использовать флешинг файлов, если вы выбираете среди файлов:

select file in *.tar.gz
104
ответ дан 18 July 2018 в 04:04

У меня есть еще один вариант, который представляет собой смесь этих ответов, но приятно то, что вам нужно только нажать один ключ, а затем сценарий продолжается благодаря опции -n для чтения. В этом примере мы запрашиваем выключение, перезагрузку или просто выходим из scrit, используя ANS в качестве нашей переменной, и пользователю нужно только нажать E, R или S. Я также установил по умолчанию выход, поэтому, если нажата клавиша ввода то скрипт выйдет.

read -n 1 -p "Would you like to exit, reboot, or shutdown? (E/r/s) " ans; case $ans in r|R) sudo reboot;; s|S) sudo poweroff;; *) exit;; esac
4
ответ дан 18 July 2018 в 04:04

Предполагая, что вы хотите использовать простое меню сценария оболочки (нет причудливого интерфейса), проверьте пример меню с http://www.tldp.org/LDP/abs/html/testbranch.html.

-1
ответ дан 18 July 2018 в 04:04

Так как это нацелено на Ubuntu, вы должны использовать любые настройки debconf бэкэнда, которые будут использоваться. Вы можете узнать бэкэнд debconf с помощью:

sudo -s "echo get debconf/frontend | debconf-communicate"

Если он говорит «диалог», то он, вероятно, использует whiptail или dialog. На Lucid это whiptail.

Если это не удается, используйте bash «select», как объяснил Деннис Уильямсон.

7
ответ дан 18 July 2018 в 04:04

Я использовал Zenity, который, кажется, всегда присутствует в Ubuntu, работает очень хорошо и имеет много возможностей. Это эскиз возможного меню:

#! /bin/bash selection=$(zenity --list "Option 1" "Option 2" "Option 3" --column="" --text="Text above column(s)" --title="My menu") case "$selection" in "Option 1")zenity --info --text="Do something here for No1";; "Option 2")zenity --info --text="Do something here for No2";; "Option 3")zenity --info --text="Do something here for No3";; esac
6
ответ дан 18 July 2018 в 04:04

Не новый ответ как таковой, но поскольку ответа еще нет, вот несколько советов и советов по кодированию для выбора и zenity:

title="Select example" prompt="Pick an option:" options=("A" "B" "C") echo "$title" PS3="$prompt " select opt in "${options[@]}" "Quit"; do case "$REPLY" in 1 ) echo "You picked $opt which is option $REPLY";; 2 ) echo "You picked $opt which is option $REPLY";; 3 ) echo "You picked $opt which is option $REPLY";; $(( ${#options[@]}+1 )) ) echo "Goodbye!"; break;; *) echo "Invalid option. Try another one.";continue;; esac done while opt=$(zenity --title="$title" --text="$prompt" --list \ --column="Options" "${options[@]}"); do case "$opt" in "${options[0]}" ) zenity --info --text="You picked $opt, option 1";; "${options[1]}" ) zenity --info --text="You picked $opt, option 2";; "${options[2]}" ) zenity --info --text="You picked $opt, option 3";; *) zenity --error --text="Invalid option. Try another one.";; esac done

Стоит упомянуть:

Оба будут зацикливаться до тех пор, пока пользователь явно не выберет Quit (или Cancel for zenity). Это хороший подход для интерактивных меню сценариев: после выбора и выполнения действия меню снова отображается для другого выбора. Если выбор предназначен только для разового использования, просто используйте break после esac (можно упростить подход zenity). Оба case основаны на индексах, а не на основе значений. Я думаю, что это проще кодировать и поддерживать Array, также используется для подхода zenity. Опция «Выход» не относится к исходным, оригинальным параметрам. При необходимости он добавляется, поэтому ваш массив остается чистым. В конце концов, «Quit» в любом случае не требуется для zenity, пользователь может просто нажать «Отменить» (или закрыть окно), чтобы выйти. Обратите внимание, как оба используют тот же, нетронутый массив опций. PS3 и REPLY vars нельзя переименовать. select жестко запрограммирован для использования. Все остальные переменные в скрипте (опция, опции, подсказка, заголовок) могут иметь любые имена, если вы выполняете настройки
49
ответ дан 18 July 2018 в 04:04
[F1]
6
ответ дан 18 July 2018 в 04:04

Bash fancy menu

Сначала попробуйте, затем зайдите на мою страницу для подробного описания ... Нет необходимости в внешних библиотеках или программах, таких как диалог или zenity ...

#/bin/bash # by oToGamez # www.pro-toolz.net E='echo -e';e='echo -en';trap "R;exit" 2 ESC=$( $e "\e") TPUT(){ $e "\e[${1};${2}H";} CLEAR(){ $e "\ec";} CIVIS(){ $e "\e[?25l";} DRAW(){ $e "\e%@\e(0";} WRITE(){ $e "\e(B";} MARK(){ $e "\e[7m";} UNMARK(){ $e "\e[27m";} R(){ CLEAR ;stty sane;$e "\ec\e[37;44m\e[J";}; HEAD(){ DRAW for each in $(seq 1 13);do $E " x x" done WRITE;MARK;TPUT 1 5 $E "BASH SELECTION MENU ";UNMARK;} i=0; CLEAR; CIVIS;NULL=/dev/null FOOT(){ MARK;TPUT 13 5 printf "ENTER - SELECT,NEXT ";UNMARK;} ARROW(){ read -s -n3 key 2>/dev/null >&2 if [[ $key = $ESC[A ]];then echo up;fi if [[ $key = $ESC[B ]];then echo dn;fi;} M0(){ TPUT 4 20; $e "Login info";} M1(){ TPUT 5 20; $e "Network";} M2(){ TPUT 6 20; $e "Disk";} M3(){ TPUT 7 20; $e "Routing";} M4(){ TPUT 8 20; $e "Time";} M5(){ TPUT 9 20; $e "ABOUT ";} M6(){ TPUT 10 20; $e "EXIT ";} LM=6 MENU(){ for each in $(seq 0 $LM);do M${each};done;} POS(){ if [[ $cur == up ]];then ((i--));fi if [[ $cur == dn ]];then ((i++));fi if [[ $i -lt 0 ]];then i=$LM;fi if [[ $i -gt $LM ]];then i=0;fi;} REFRESH(){ after=$((i+1)); before=$((i-1)) if [[ $before -lt 0 ]];then before=$LM;fi if [[ $after -gt $LM ]];then after=0;fi if [[ $j -lt $i ]];then UNMARK;M$before;else UNMARK;M$after;fi if [[ $after -eq 0 ]] || [ $before -eq $LM ];then UNMARK; M$before; M$after;fi;j=$i;UNMARK;M$before;M$after;} INIT(){ R;HEAD;FOOT;MENU;} SC(){ REFRESH;MARK;$S;$b;cur=`ARROW`;} ES(){ MARK;$e "ENTER = main menu ";$b;read;INIT;};INIT while [[ "$O" != " " ]]; do case $i in 0) S=M0;SC;if [[ $cur == "" ]];then R;$e "\n$(w )\n";ES;fi;; 1) S=M1;SC;if [[ $cur == "" ]];then R;$e "\n$(ifconfig )\n";ES;fi;; 2) S=M2;SC;if [[ $cur == "" ]];then R;$e "\n$(df -h )\n";ES;fi;; 3) S=M3;SC;if [[ $cur == "" ]];then R;$e "\n$(route -n )\n";ES;fi;; 4) S=M4;SC;if [[ $cur == "" ]];then R;$e "\n$(date )\n";ES;fi;; 5) S=M5;SC;if [[ $cur == "" ]];then R;$e "\n$($e by oTo)\n";ES;fi;; 6) S=M6;SC;if [[ $cur == "" ]];then R;exit 0;fi;; esac;POS;done
4
ответ дан 18 July 2018 в 04:04

Используя dialog, команда будет выглядеть так:

dialog --clear --backtitle "Backtitle here" --title "Title here" --menu "Choose one of the following options:" 15 40 4 \ 1 "Option 1" \ 2 "Option 2" \ 3 "Option 3"

dialog

Поместить его в скрипт:

#!/bin/bash HEIGHT=15 WIDTH=40 CHOICE_HEIGHT=4 BACKTITLE="Backtitle here" TITLE="Title here" MENU="Choose one of the following options:" OPTIONS=(1 "Option 1" 2 "Option 2" 3 "Option 3") CHOICE=$(dialog --clear \ --backtitle "$BACKTITLE" \ --title "$TITLE" \ --menu "$MENU" \ $HEIGHT $WIDTH $CHOICE_HEIGHT \ "${OPTIONS[@]}" \ 2>&1 >/dev/tty) clear case $CHOICE in 1) echo "You chose Option 1" ;; 2) echo "You chose Option 2" ;; 3) echo "You chose Option 3" ;; esac
33
ответ дан 24 July 2018 в 17:59
  • 1
    Я хотел бы отметить, что я поместил строку TERMINAL=$(tty) в начало моего скрипта, а затем в определении переменной CHOICE я изменил 2>&1 >/dev/tty на 2>&1 >$TERMINAL, чтобы избежать проблем с перенаправлением, если сценарий запускался в другом конечный контекст. – Shrout1 12 June 2018 в 17:37

В ответе serverfault уже есть тот же вопрос. В этом решении используется whiptail.

2
ответ дан 24 July 2018 в 17:59
  • 1
    Спасибо, но поскольку мой сценарий предназначен для основного потребления, я не хочу, чтобы у него были дополнительные зависимости. Но я добавлю, что для использования в будущем, кто знает. – Daniel Rodrigues 9 August 2010 в 03:01
#!/bin/bash # Bash Menu Script Example PS3='Please enter your choice: ' options=("Option 1" "Option 2" "Option 3" "Quit") select opt in "${options[@]}" do case $opt in "Option 1") echo "you chose choice 1" ;; "Option 2") echo "you chose choice 2" ;; "Option 3") echo "you chose choice $REPLY which is $opt" ;; "Quit") break ;; *) echo "invalid option $REPLY";; esac done

Добавьте break инструкции, где вам понадобится цикл select для выхода. Если break не выполняется, оператор select зацикливается, и меню снова отображается.

В третьем варианте я включил переменные, заданные оператором select, чтобы продемонстрировать, что у вас есть доступ к этим значениям. Если вы выберете его, он выведет:

you chose choice 3 which is Option 3

Вы можете видеть, что $REPLY содержит строку, введенную в командной строке. Он используется как индекс в массиве ${options[@]}, как если бы массив был основан на 1. Переменная $opt содержит строку из этого индекса в массиве.

Обратите внимание, что выбор может быть простым списком непосредственно в инструкции select следующим образом:

select opt in foo bar baz 'multi word choice'

, но вы не можете поместить такой список в скалярную переменную из-за пробелов в одном из вариантов.

Вы также можете использовать флешинг файлов, если вы выбираете среди файлов:

select file in *.tar.gz
105
ответ дан 24 July 2018 в 17:59
  • 1
    @Abdull: Это намеренное поведение. Вывод "Quit" option выполняет break, который вырывается из цикла select. Вы можете добавить break где угодно. В Bash manual указано «Команды выполняются после каждого выбора до тех пор, пока не будет выполнена команда break, после чего команда выбора завершается». – Dennis Williamson 7 December 2015 в 21:31
  • 2
    FWIW, запуская это в 14.04 с GNU bash 4.3.11, выдает ошибки в строке 9: ./test.sh: line 9: syntax error near unexpected token "Вариант 1" ./test.sh: строка 9: `& quot; Вариант 1 & quot;) '` – Brian Morton 8 December 2016 в 18:59
  • 3
    @BrianMorton: Я не могу воспроизвести это. Вероятно, вам не хватает цитаты или какого-либо другого персонажа раньше в скрипте (или есть дополнительная). – Dennis Williamson 8 December 2016 в 22:37
  • 4
    Должна ли эта работа работать над малиной Pi A +, raspbian wheezy? Я новичок в обоих. – Rod 3 June 2017 в 08:39
  • 5
    @dtmland: PS3 - приглашение для команды select. Он используется автоматически и не требует прямой ссылки. PS3 и select . – Dennis Williamson 1 December 2017 в 00:55

У меня есть еще один вариант, который представляет собой смесь этих ответов, но приятно то, что вам нужно только нажать один ключ, а затем сценарий продолжается благодаря опции -n для чтения. В этом примере мы запрашиваем выключение, перезагрузку или просто выходим из scrit, используя ANS в качестве нашей переменной, и пользователю нужно только нажать E, R или S. Я также установил по умолчанию выход, поэтому, если нажата клавиша ввода то скрипт выйдет.

read -n 1 -p "Would you like to exit, reboot, or shutdown? (E/r/s) " ans; case $ans in r|R) sudo reboot;; s|S) sudo poweroff;; *) exit;; esac
4
ответ дан 24 July 2018 в 17:59

Предполагая, что вы хотите использовать простое меню сценария оболочки (нет причудливого интерфейса), проверьте пример меню с http://www.tldp.org/LDP/abs/html/testbranch.html.

-1
ответ дан 24 July 2018 в 17:59
  • 1
    Как и в большинстве других фрагментов в расширенном руководстве по созданию сценариев, эти фрагменты содержат ошибки и плохую практику. – geirha 4 February 2011 в 03:39

Так как это нацелено на Ubuntu, вы должны использовать любые настройки debconf бэкэнда, которые будут использоваться. Вы можете узнать бэкэнд debconf с помощью:

sudo -s "echo get debconf/frontend | debconf-communicate"

Если он говорит «диалог», то он, вероятно, использует whiptail или dialog. На Lucid это whiptail.

Если это не удается, используйте bash «select», как объяснил Деннис Уильямсон.

7
ответ дан 24 July 2018 в 17:59
  • 1
    Это, вероятно, слишком велико для этого вопроса, но +1 для упоминания whiptail и диалога! Я не знал об этих командах ... очень мило! – MestreLion 5 August 2011 в 10:58

Я использовал Zenity, который, кажется, всегда присутствует в Ubuntu, работает очень хорошо и имеет много возможностей. Это эскиз возможного меню:

#! /bin/bash selection=$(zenity --list "Option 1" "Option 2" "Option 3" --column="" --text="Text above column(s)" --title="My menu") case "$selection" in "Option 1")zenity --info --text="Do something here for No1";; "Option 2")zenity --info --text="Do something here for No2";; "Option 3")zenity --info --text="Do something here for No3";; esac
6
ответ дан 24 July 2018 в 17:59
  • 1
    К сожалению! извините за появление этого фрагмента, первое сообщение и, похоже, нужно отключить HTML – LazyEchidna 5 May 2011 в 06:36
  • 2
    Лучше, включил «образец кода» в редактировании, извините за это – LazyEchidna 5 May 2011 в 06:47

Не новый ответ как таковой, но поскольку ответа еще нет, вот несколько советов и советов по кодированию для выбора и zenity:

title="Select example" prompt="Pick an option:" options=("A" "B" "C") echo "$title" PS3="$prompt " select opt in "${options[@]}" "Quit"; do case "$REPLY" in 1 ) echo "You picked $opt which is option $REPLY";; 2 ) echo "You picked $opt which is option $REPLY";; 3 ) echo "You picked $opt which is option $REPLY";; $(( ${#options[@]}+1 )) ) echo "Goodbye!"; break;; *) echo "Invalid option. Try another one.";continue;; esac done while opt=$(zenity --title="$title" --text="$prompt" --list \ --column="Options" "${options[@]}"); do case "$opt" in "${options[0]}" ) zenity --info --text="You picked $opt, option 1";; "${options[1]}" ) zenity --info --text="You picked $opt, option 2";; "${options[2]}" ) zenity --info --text="You picked $opt, option 3";; *) zenity --error --text="Invalid option. Try another one.";; esac done

Стоит упомянуть:

Оба будут зацикливаться до тех пор, пока пользователь явно не выберет Quit (или Cancel for zenity). Это хороший подход для интерактивных меню сценариев: после выбора и выполнения действия меню снова отображается для другого выбора. Если выбор предназначен только для разового использования, просто используйте break после esac (можно упростить подход zenity). Оба case основаны на индексах, а не на основе значений. Я думаю, что это проще кодировать и поддерживать Array, также используется для подхода zenity. Опция «Выход» не относится к исходным, оригинальным параметрам. При необходимости он добавляется, поэтому ваш массив остается чистым. В конце концов, «Quit» в любом случае не требуется для zenity, пользователь может просто нажать «Отменить» (или закрыть окно), чтобы выйти. Обратите внимание, как оба используют тот же, нетронутый массив опций. PS3 и REPLY vars нельзя переименовать. select жестко запрограммирован для использования. Все остальные переменные в скрипте (опция, опции, подсказка, заголовок) могут иметь любые имена, если вы выполняете настройки
49
ответ дан 24 July 2018 в 17:59
  • 1
    Удивительное объяснение. Спасибо. Этот вопрос по-прежнему занимает высокое место в Google, так что плохо он закрыт. – MountainX 30 June 2013 в 13:44
  • 2
    Вы можете использовать ту же структуру case для версии select, которую вы используете для версии zenity: case "$opt" in . . . "${options[0]}" ) . . . (вместо $REPLY и индексов 1, 2 и 3 ]). – Dennis Williamson 29 May 2018 в 23:40
  • 3
    @DennisWilliamson, да, я мог бы, и в "real & quot; кода было бы предпочтительнее использовать одну и ту же структуру в обоих случаях. Я намеренно хотел показать связь между $REPLY, индексами и значениями. – MestreLion 31 May 2018 в 23:28
[F1]
6
ответ дан 24 July 2018 в 17:59
  • 1
    Я знаю, что это старо, но нужна первая строка для чтения #! / Bin / bash для компиляции. – JClar 7 December 2014 в 16:15
  • 2
    Обзор кода: $ отсутствует в переменной $opt в инструкции while. Оператор if является избыточным. Несогласованный отступ. Использование menu в некоторых местах, где должно быть «show_menu . show_menu`, может быть помещено в начало цикла вместо повторения в каждом case. Несогласованный отступ. Смешивание использования одиночных квадратных скобок и удвоенных. Использование жестко кодированных ANSI-последовательностей вместо tput. Использование имен all-caps var не рекомендуется. FGRED следует называть bgred. Использование backticks вместо $(). Определение функции должно быть последовательным и не использовать ... – Dennis Williamson 29 May 2018 в 23:57
  • 3
    ... обе формы вместе. Терминальные точки с запятой не нужны. Некоторые цвета и т. Д. Определяются дважды. Случай с \n никогда не будет выполнен. Возможно, больше. – Dennis Williamson 30 May 2018 в 00:01

Bash fancy menu

Сначала попробуйте, затем зайдите на мою страницу для подробного описания ... Нет необходимости в внешних библиотеках или программах, таких как диалог или zenity ...

#/bin/bash # by oToGamez # www.pro-toolz.net E='echo -e';e='echo -en';trap "R;exit" 2 ESC=$( $e "\e") TPUT(){ $e "\e[${1};${2}H";} CLEAR(){ $e "\ec";} CIVIS(){ $e "\e[?25l";} DRAW(){ $e "\e%@\e(0";} WRITE(){ $e "\e(B";} MARK(){ $e "\e[7m";} UNMARK(){ $e "\e[27m";} R(){ CLEAR ;stty sane;$e "\ec\e[37;44m\e[J";}; HEAD(){ DRAW for each in $(seq 1 13);do $E " x x" done WRITE;MARK;TPUT 1 5 $E "BASH SELECTION MENU ";UNMARK;} i=0; CLEAR; CIVIS;NULL=/dev/null FOOT(){ MARK;TPUT 13 5 printf "ENTER - SELECT,NEXT ";UNMARK;} ARROW(){ read -s -n3 key 2>/dev/null >&2 if [[ $key = $ESC[A ]];then echo up;fi if [[ $key = $ESC[B ]];then echo dn;fi;} M0(){ TPUT 4 20; $e "Login info";} M1(){ TPUT 5 20; $e "Network";} M2(){ TPUT 6 20; $e "Disk";} M3(){ TPUT 7 20; $e "Routing";} M4(){ TPUT 8 20; $e "Time";} M5(){ TPUT 9 20; $e "ABOUT ";} M6(){ TPUT 10 20; $e "EXIT ";} LM=6 MENU(){ for each in $(seq 0 $LM);do M${each};done;} POS(){ if [[ $cur == up ]];then ((i--));fi if [[ $cur == dn ]];then ((i++));fi if [[ $i -lt 0 ]];then i=$LM;fi if [[ $i -gt $LM ]];then i=0;fi;} REFRESH(){ after=$((i+1)); before=$((i-1)) if [[ $before -lt 0 ]];then before=$LM;fi if [[ $after -gt $LM ]];then after=0;fi if [[ $j -lt $i ]];then UNMARK;M$before;else UNMARK;M$after;fi if [[ $after -eq 0 ]] || [ $before -eq $LM ];then UNMARK; M$before; M$after;fi;j=$i;UNMARK;M$before;M$after;} INIT(){ R;HEAD;FOOT;MENU;} SC(){ REFRESH;MARK;$S;$b;cur=`ARROW`;} ES(){ MARK;$e "ENTER = main menu ";$b;read;INIT;};INIT while [[ "$O" != " " ]]; do case $i in 0) S=M0;SC;if [[ $cur == "" ]];then R;$e "\n$(w )\n";ES;fi;; 1) S=M1;SC;if [[ $cur == "" ]];then R;$e "\n$(ifconfig )\n";ES;fi;; 2) S=M2;SC;if [[ $cur == "" ]];then R;$e "\n$(df -h )\n";ES;fi;; 3) S=M3;SC;if [[ $cur == "" ]];then R;$e "\n$(route -n )\n";ES;fi;; 4) S=M4;SC;if [[ $cur == "" ]];then R;$e "\n$(date )\n";ES;fi;; 5) S=M5;SC;if [[ $cur == "" ]];then R;$e "\n$($e by oTo)\n";ES;fi;; 6) S=M6;SC;if [[ $cur == "" ]];then R;exit 0;fi;; esac;POS;done
4
ответ дан 24 July 2018 в 17:59
  • 1
    Это работает только с bash, вроде бы круто. – Layton Everson 17 November 2015 в 04:35
  • 2
    хороший! & quot; затем перейдите на мою страницу для подробного описания & quot; есть ли ссылка? – oak 14 December 2015 в 17:36
  • 3
    [D0] pro-toolz.net/data/programming/bash/Bash_fancy_menu.html – jobwat 7 June 2016 в 08:08

Другие вопросы по тегам:

Похожие вопросы: