Shell скрипты (Помогите новичку =))

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
Viper-2
Сообщения: 79
ОС: Debian 4.0, Linux 2.6.18-4-686

Shell скрипты

Сообщение Viper-2 »

Вот тут меня прибило писать скрипты на SHELL для установки различных пакетов чужих дистров.. вобщем суть не в этом :)

1.Имеется у меня скрипт который считывает строку из файла в переменную, работает он так:
ФАЙЛ
> cat /etc/file.cfg
/etc/dir1

СКРИПТ
>cat /usr/local/bin/script
#!/bin/sh
Dir="`cat /etc/file.cfg`"
cd $Dir
...

Мне бы хотелось чтобы файл /etc/file.cfg имел следующий вид:
ФАЙЛ
> cat /etc/file.cfg
Dir1=/etc/dir1
Dir2=/etc/dir2

Впрочем придать такой вид файлу я могу сам ^^ но как должен выглядеть скрипт, чтобы он считывал эти строчки в переменные? Причем имя переменных не должно быть именно Dir1 и Dir2 - эти строчки скрипт должен просто отбросить и задать переменным только то, что содержится в строке после знака =
2. как собственно заставить скрипт принимать какие либо параметры задаваемые пользователем? :-)
СКРИПТ
>cat /usr/local/bin/script
#!/bin/sh
case "$1" in
--install)
парам парам ;;
--check)
парам парам ;;
esac

Если сделать так, то скрипт примет либо --install, либо --check, но мне нужно чтобы скрипт выполнил их обе, причем в определенном порядке независимо от того в каком порядке они были записаны в консоли! ( /usr/local/bin/script --install /usr/local/bin/script --check )
3. Эм... :rolleyes:
СКРИПТ
>cat /usr/local/bin/script
#!/bin/sh
echo -n "Введите имя пакета: "
read PackageName

При данной конструкции скрипт нужно сначало запустить, а потом он уже присваивает значения (вы и сами это поняли ^^), а как сделать чтобы скрипт присвоил значение переменной если в консоли дать команду /usr/local/bin/script proftpd ? тоесть при ходе выполнения скрипт уже будет знать, что PackageName=proftpd и не будет чего-то спрашивать

Я совсем недавно подсел на shell, поэтому не ругайте сильно = ) Спасибо всем кто откликнется
RedHat 4.0, Debian 3.1, Open SuSE 10.1, Open SuSE 10.2, ASP Linux 11.2, Ubuntu 7.04, Debian 4.0, Open SuSE 10.3, Gentoo 2007, Ubuntu 7.10, Ubuntu 8.04!
Спасибо сказали:
Аватара пользователя
sergeyvp
Сообщения: 807
ОС: ubuntu

Re: Shell скрипты

Сообщение sergeyvp »

Viper-2 писал(а):
25.05.2007 14:35
скрипт должен просто отбросить и задать переменным только то, что содержится в строке после знака =

http://linfoline.homedns.org/bash/abs-book.html
раздел замена подстроки
2. как собственно заставить скрипт принимать какие либо параметры задаваемые пользователем? :-)

В скриптах на шелл параметрам командной строки соответсвуют специальные переменные, то есть
$0 -- имя команды
$1 -- первый параметр этой команды
$2 -- второй параметр и т.д.

Подробности см. тут
http://linfoline.homedns.org/bash/abs-book.html
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Shell скрипты

Сообщение Uncle_Theodore »

3.

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

#!/bin/bash

if [ -z $1 ]
then echo "Input package name"
read PackageName
else PackageName=$1
fi

echo $PackageName


По поводу 2. Намек.

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

teddy@laptop~$ i='Dir=/home/teddy'
teddy@laptop~$ echo $i
Dir=/home/teddy
teddy@laptop~$ echo ${i#*=}
/home/teddy
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: Shell скрипты

Сообщение KiWi »

Я вот думаю, а нафига тогда писать Dir1 & Dir2?
Спасибо сказали:
Аватара пользователя
Viper-2
Сообщения: 79
ОС: Debian 4.0, Linux 2.6.18-4-686

Re: Shell скрипты

Сообщение Viper-2 »

Ы! спасибо за ссылки, обязательно прочту и спасибо Uncle_Theodore как раз то, что я искал ;)
RedHat 4.0, Debian 3.1, Open SuSE 10.1, Open SuSE 10.2, ASP Linux 11.2, Ubuntu 7.04, Debian 4.0, Open SuSE 10.3, Gentoo 2007, Ubuntu 7.10, Ubuntu 8.04!
Спасибо сказали:
Аватара пользователя
Viper-2
Сообщения: 79
ОС: Debian 4.0, Linux 2.6.18-4-686

Re: Shell скрипты

Сообщение Viper-2 »

to KiWi: а писать Dir1 для того, что в этом файле по идее буду еще конфигурации, а не только пути к дирректориям =)
RedHat 4.0, Debian 3.1, Open SuSE 10.1, Open SuSE 10.2, ASP Linux 11.2, Ubuntu 7.04, Debian 4.0, Open SuSE 10.3, Gentoo 2007, Ubuntu 7.10, Ubuntu 8.04!
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: Shell скрипты

Сообщение KiWi »

Viper-2 писал(а):
25.05.2007 17:02
to KiWi: а писать Dir1 для того, что в этом файле по идее буду еще конфигурации, а не только пути к дирректориям =)

Да, а как же:
Причем имя переменных не должно быть именно Dir1 и Dir2 - эти строчки скрипт должен просто отбросить и задать переменным только то, что содержится в строке после знака =

?

P.S.: честно -- по-моему, у вас бардак в голове.
Спасибо сказали:
Аватара пользователя
Viper-2
Сообщения: 79
ОС: Debian 4.0, Linux 2.6.18-4-686

Re: Shell скрипты

Сообщение Viper-2 »

Ну да, ты праву меня бардак =) как бы так отмазаццо... я просто имел ввиду, что к скрипту никак не привязаны строки Dir1 :-D или они могут изменятся... да и вообще действительно можно было обойтись без них, но както попорядочнее выглядит, когда в файле все подписано :) что-то типо индекса...
RedHat 4.0, Debian 3.1, Open SuSE 10.1, Open SuSE 10.2, ASP Linux 11.2, Ubuntu 7.04, Debian 4.0, Open SuSE 10.3, Gentoo 2007, Ubuntu 7.10, Ubuntu 8.04!
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: Shell скрипты

Сообщение KiWi »

Viper-2 писал(а):
25.05.2007 19:57
Ну да, ты праву меня бардак =) как бы так отмазаццо... я просто имел ввиду, что к скрипту никак не привязаны строки Dir1 :-D или они могут изменятся... да и вообще действительно можно было обойтись без них, но както попорядочнее выглядит, когда в файле все подписано :) что-то типо индекса...

Если директории разнородные, то почему бы не заводить переменные с разными именами(DISTDIR, PORTDIR, ...)?
Если директории однородные, то bash & массив? Ну, или да, DIR_<n> и количество директорий, а далее -- DIR=$(eval echo \${DIR_${i}}) -- что-то типа такого...
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Shell скрипты

Сообщение elide »

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

#!/bin/bash
config=~/.remove.me

function get_opt(){
        sed -rn "/$1:/{s/$1: *(.*)$/\1/;p}" "$config" 2> /dev/null
}

function set_opt(){
    sed -i "/$1:/d" "$config" &> /dev/null
    echo "$1: $2" >> "$config"
}

[ -f "$config" ] || {
    echo 'default config'
    set_opt host 'localhost'
    set_opt port '3128'
}

HOST=`get_opt host`
PORT=`get_opt port`

echo $HOST
echo $PORT
слава роботам!
Спасибо сказали:
Аватара пользователя
Viper-2
Сообщения: 79
ОС: Debian 4.0, Linux 2.6.18-4-686

Re: Shell скрипты

Сообщение Viper-2 »

Массив в баше я пока ниасилил )))
RedHat 4.0, Debian 3.1, Open SuSE 10.1, Open SuSE 10.2, ASP Linux 11.2, Ubuntu 7.04, Debian 4.0, Open SuSE 10.3, Gentoo 2007, Ubuntu 7.10, Ubuntu 8.04!
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Shell скрипты

Сообщение Uncle_Theodore »

Viper-2 писал(а):
26.05.2007 08:31
Массив в баше я пока ниасилил )))

А что там осиливать? :)

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

teddy@laptop~$ for ((i=10;$i>0;i--)); do ss[$i]=$((10-$i)); done
teddy@laptop~$ for ((i=1;$i<11;i++)); do echo ${ss[$i]}; done
9
8
7
6
5
4
3
2
1
0
Спасибо сказали: