Страница 1 из 1
bash скрипт меню
Добавлено: 2009-10-18 8:00:45
levantuev
Люди пожалуйста напишите скрипт, при запуске которого ,
если нажать цифру "1", он выдавал на экран ifconfig,
если цифру "2", то выдавал top и.т.п,
а если нажать цифру "9", то пользователь попадает в консоль
Re: bash скрипт меню
Добавлено: 2009-10-18 9:40:06
rainy
Код: Выделить всё
read comm
if [ $comm -eq 1 ] ; then
ifconfig
exit
else
if [ $comm -eq 2 ] ; then
top
exit
else
exit
fi
fi
примерно так. Идея я думаю понятна.
Re: bash скрипт меню
Добавлено: 2009-10-18 10:11:58
levantuev
Большое спасибо, но немного не понятно, как добавить 3,4,5 ? пробовал:
if [ $comm -eq 2 ] ; then
netstat -r
exit
не получается, ругается на "fi" (я в shell плохо разбераюсь)
Re: bash скрипт меню
Добавлено: 2009-10-18 10:17:39
Alex Keda
Re: bash скрипт меню
Добавлено: 2009-10-18 10:24:38
levantuev
Все сделал

Re: bash скрипт меню
Добавлено: 2009-10-18 16:26:50
princeps
может теме в скриптах место?
Re: bash скрипт меню
Добавлено: 2009-10-18 16:32:19
levantuev
Вроде создал в скриптах, но перенесли...
Re: bash скрипт меню
Добавлено: 2009-10-18 17:06:31
princeps
f_andrey как из Киева с конференции приехал, сердитый стал

Re: bash скрипт меню
Добавлено: 2009-10-19 6:04:42
Гость
rainy писал(а):read comm
и после каждого выбора надо нажимать
Enter?
read в sh(1) не умеет считывать посимвольно, но bash и zsh умеют
Код: Выделить всё
#! /usr/bin/env bash
declare -A comm desc
comm[1]='ifconfig -a' desc[1]='show network interfaces'
comm[2]='top' desc[2]='run top(1)'
comm[9]='bash' desc[9]='escape into shell'
comm[q]='exit' desc[q]='quit'
for key in ${!desc[@]}; do
echo $key \) ${desc[$key]}
done
while read -sn1 input; do
for key in ${!comm[@]}; do
if [[ $input == $key ]]; then
eval ${comm[$key]}
continue 2
fi
done
echo wrong choice: $input
done
Код: Выделить всё
$ ./menu.bash
q ) quit
1 ) show network interfaces
2 ) run top(1)
9 ) escape into shell
wrong choice: h
wrong choice: u
xl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=b<RXCSUM,TXCSUM,VLAN_MTU>
ether 00:11:22:33:44:55
inet 1.2.3.4 netmask 0xffffffff broadcast 1.2.3.4
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
pflog0: flags=141<UP,RUNNING,PROMISC> metric 0 mtu 33152
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
options=3<RXCSUM,TXCSUM>
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
Re: bash скрипт меню
Добавлено: 2009-10-19 6:15:17
Гость
добавить новый пункт в меню можно добавив новое определение элемента
comm и
desc, напр.
Код: Выделить всё
comm[3]='netstat -r' desc[3]='show routing table'
и вуаля, получаем новое меню
Код: Выделить всё
$ ./menu.bash
q ) quit
1 ) show network interfaces
2 ) run top(1)
3 ) show routing table
9 ) escape into shell
Re: bash скрипт меню
Добавлено: 2009-10-19 9:10:50
levantuev
как бы такое дело через sh организовать и запретить останавливать скрипт через ctrl+c
Re: bash скрипт меню
Добавлено: 2009-10-19 11:47:15
manefesto
man sh
Re: bash скрипт меню
Добавлено: 2009-10-19 12:09:46
levantuev
точно, как я раньше та не догадался... Спасибо
Re: bash скрипт меню
Добавлено: 2009-10-19 12:11:38
Гость
levantuev писал(а):как бы такое дело через sh организовать
в названии темы упоминается скрипт на
bash. Если использовать
убогий sh(1), то скрипт растолстеет в прожорливости и размере.
Если bash/zsh не подходит, то лучше использовать tcl/python/perl нежели сооружать гору костылей из awk/sed/grep в sh.
levantuev писал(а): и запретить останавливать скрипт через ctrl+c
либо отключить обработку символов на сигналы в терминале
либо перехватывать SIGINT в самом скрипте