Страница 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
мануал по шеллу почитайте...
http://www.lissyara.su/?id=1075

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
либо отключить обработку символов на сигналы в терминале

Код: Выделить всё

stty -isig
либо перехватывать SIGINT в самом скрипте

Код: Выделить всё

trap '' int