bash скрипт меню

Разговоры ни о чём

Модератор: vadim64

levantuev
сержант
Сообщения: 168
Зарегистрирован: 2008-11-05 6:15:43
Контактная информация:

bash скрипт меню

Непрочитанное сообщение levantuev » 2009-10-18 8:00:45

Люди пожалуйста напишите скрипт, при запуске которого ,
если нажать цифру "1", он выдавал на экран ifconfig,
если цифру "2", то выдавал top и.т.п,
а если нажать цифру "9", то пользователь попадает в консоль
Последний раз редактировалось f_andrey 2009-10-18 8:08:21, всего редактировалось 1 раз.
Причина: "напишите скрипт" формулировка приемлима только для /dev/null

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

rainy
мл. сержант
Сообщения: 76
Зарегистрирован: 2008-02-01 23:26:45

Re: bash скрипт меню

Непрочитанное сообщение rainy » 2009-10-18 9:40:06

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

read comm

if [ $comm -eq 1 ] ; then
  ifconfig
  exit
else 
      if [ $comm -eq 2 ] ; then
      top
      exit
      else
      exit
      fi
fi
примерно так. Идея я думаю понятна.

levantuev
сержант
Сообщения: 168
Зарегистрирован: 2008-11-05 6:15:43
Контактная информация:

Re: bash скрипт меню

Непрочитанное сообщение levantuev » 2009-10-18 10:11:58

Большое спасибо, но немного не понятно, как добавить 3,4,5 ? пробовал:

if [ $comm -eq 2 ] ; then
netstat -r
exit

не получается, ругается на "fi" (я в shell плохо разбераюсь)

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35466
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: bash скрипт меню

Непрочитанное сообщение Alex Keda » 2009-10-18 10:17:39

мануал по шеллу почитайте...
http://www.lissyara.su/?id=1075
Убей их всех! Бог потом рассортирует...


princeps
майор
Сообщения: 2684
Зарегистрирован: 2007-09-25 10:20:59
Откуда: Сочи, Москва
Контактная информация:

Re: bash скрипт меню

Непрочитанное сообщение princeps » 2009-10-18 16:26:50

может теме в скриптах место?
Deus quos vult perdere dementat prius
http://www.itforum-sochi.ru

levantuev
сержант
Сообщения: 168
Зарегистрирован: 2008-11-05 6:15:43
Контактная информация:

Re: bash скрипт меню

Непрочитанное сообщение levantuev » 2009-10-18 16:32:19

Вроде создал в скриптах, но перенесли...

princeps
майор
Сообщения: 2684
Зарегистрирован: 2007-09-25 10:20:59
Откуда: Сочи, Москва
Контактная информация:

Re: bash скрипт меню

Непрочитанное сообщение princeps » 2009-10-18 17:06:31

f_andrey как из Киева с конференции приехал, сердитый стал :)
Deus quos vult perdere dementat prius
http://www.itforum-sochi.ru

Гость
проходил мимо

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

levantuev
сержант
Сообщения: 168
Зарегистрирован: 2008-11-05 6:15:43
Контактная информация:

Re: bash скрипт меню

Непрочитанное сообщение levantuev » 2009-10-19 9:10:50

как бы такое дело через sh организовать и запретить останавливать скрипт через ctrl+c

Аватара пользователя
manefesto
Группенфюррер
Сообщения: 6934
Зарегистрирован: 2007-07-20 8:27:30
Откуда: Пермь
Контактная информация:

Re: bash скрипт меню

Непрочитанное сообщение manefesto » 2009-10-19 11:47:15

man sh
я такой яростный шо аж пиздеЦ
Изображение

levantuev
сержант
Сообщения: 168
Зарегистрирован: 2008-11-05 6:15:43
Контактная информация:

Re: bash скрипт меню

Непрочитанное сообщение levantuev » 2009-10-19 12:09:46

точно, как я раньше та не догадался... Спасибо

Гость
проходил мимо

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