Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Linux и FreeBSD » Программирование в *nix » select + if

Ответить
Настройки темы
select + if

Пользователь


Сообщения: 96
Благодарности: 2

Профиль | Отправить PM | Цитировать


Помогите пожалуйста разобраться. Пишу небольшой скриптик, который будет создавать виртуальных хосты для Apache. В начале он будет выводить в консоль 2 варианта на выбор: Apache2 или Apache1.3
В зависимости от выбора пользователя будет выполнятся своя часть скрипта. Собственно весь скрипт тут не важен, а интересна мне именно эта часть:




Код: Выделить весь код
echo Where do you want to create virtual host?
select opt in "Apache2" "Apache1.3"; do
if [ "$opt" = "Apache2" ]; then

#Apache2
echo -n "Enter pagename:"
read PAGENAME
echo -n "Page will be called $PAGENAME ?"
read REPLY2
if [ "$REPLY2" = "y" ];
then
  continue
else
  exit 0
fi
Дело в том, что выполняется сценарий только того места, где спрашивается Page will be called $PAGENAME ?
Дальше выполнение прерывается. Я подозреваю, что хитрость в каком-то конфликте между этими условиями
if [ "$opt" = "Apache2" ];
и
if [ "$REPLY2" = "y" ];

Но никак не могу понять, как заставить его работать.




Если нужно, здесь весь скрипт.

читать дальше »
Код: Выделить весь код
function ch {

echo changing home directory permissions:
echo $BASEDIR ...
chown svn.www $BASEDIR
echo $HOMEDIR ...
mkdir $HOMEDIR
chown svn.www $HOMEDIR
chmod 755 $HOMEDIR
mkdir $TMPDIR
chown svn.www $TMPDIR
chmod 1770 $TMPDIR
mkdir $LOGDIR
chown root.www $LOGDIR
chmod 755 $LOGDIR
cp $SKEL $HOMEDIR
              }

echo Where do you want to create virtual host?
select opt in "Apache2" "Apache1.3"; do
if [ "$opt" = "Apache2" ]; then

#Apache2
echo -n "Enter pagename:"
read PAGENAME
echo -n "Page will be called $PAGENAME ?"
read REPLY2
if [ "$REPLY2" = "y" ];
then
  continue
else
  exit 0
fi

BASEDIR=/srv/virtual_2/$PAGENAME
HOMEDIR=$BASEDIR/./html
TMPDIR=$BASEDIR/tmp
LOGDIR=$BASEDIR/logs
GROUP=www
SHELL=/bin/bash
SKEL=/etc/web_skel/index.html

mkdir $BASEDIR
echo changing home directory permissions:
echo $BASEDIR ...
chown svn.www $BASEDIR
echo $HOMEDIR ...
mkdir $HOMEDIR
chown svn.www $HOMEDIR
chmod 755 $HOMEDIR
mkdir $TMPDIR
chown svn.www $TMPDIR
chmod 1770 $TMPDIR
mkdir $LOGDIR
chown root.www $LOGDIR
chmod 755 $LOGDIR
cp $SKEL $HOMEDIR
ch

echo
echo creating webserver configuration ...
sed s/XXXXXX/$PAGENAME/ < /etc/apache2/vserver.proto >$PAGENAME.http
echo please review new server configuration for $PAGENAME
sleep 2
vim $PAGENAME.http
echo appending new configuration to apache configuration file
cat $PAGENAME.http >>/etc/apache2/vhosts.d/vhosts.conf
rm -i $PAGENAME.http

echo restarting apache
/etc/init.d/apache2 restart

echo Apache2 virtual host is done
exit

#Apache1
elif [ "$opt" = "Apache1.3" ]; then
echo -n "Enter pagename:"
read PAGENAME1

echo -n "Page will be called $PAGENAME1?"
read REPLY
if [ "$REPLY" = "y" ];
then
  continue
else
  exit 0
fi

BASEDIR=/srv/virtual_1.3/$PAGENAME1
HOMEDIR=$BASEDIR/./html
TMPDIR=$BASEDIR/tmp
LOGDIR=$BASEDIR/logs
GROUP=www
SHELL=/bin/bash
SKEL=/etc/web_skel/index.html

mkdir $BASEDIR
ch

echo
echo creating webserver configuration ...
sed s/XXXXXX/$PAGENAME/ < /etc/apache1.3/vserver.proto >$PAGENAME.http
echo please review new server configuration for $PAGENAME
sleep 2
vim $PAGENAME.http
echo appending new configuration to apache configuration file
cat $PAGENAME.http >>/etc/apache1.3/httpd.conf
rm -i $PAGENAME.http

echo restarting apache
/etc/init.d/apache1.3 restart
echo Apache2 virtual host is done

else
   clear
     echo You must enter 1 or 2

fi
done

Отправлено: 15:17, 26-05-2010

 

Аватара для [mzd]

Линуксоид-стакановец


Сообщения: 2391
Благодарности: 186

Профиль | Отправить PM | Цитировать


Насколько я знаю, select закрывается done, а if закрывается fi. В вашем примере этого нет. Вполне возможно, в этом проблема.
Вот пример с options и select:
Код: Выделить весь код
#!/bin/bash
           OPTIONS="Hello Quit"
           select opt in $OPTIONS; do
               if [ "$opt" = "Quit" ]; then
                echo done
                exit
               elif [ "$opt" = "Hello" ]; then
                echo Hello World
               else
                clear
                echo bad option
               fi
           done

-------
Живя в реальном мире, стремись к невероятному... Эрнесто Че Гевара
Everybody lies. (c) House M.D.
Базовая настройка Ubuntu. Документация для новичка.
Руководство по установке, начальной настройке и основам использования операционной системы Ubuntu


Отправлено: 16:07, 26-05-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Пользователь


Сообщения: 96
Благодарности: 2

Профиль | Отправить PM | Цитировать


Нет-нет, done и fi есть, посмотрите полный скрипт.
Насколько я понимаю select должен заканчиваться в конце скрипта, после выполнения всех действий, поэтому done и fi от первого условия поставлены в конце. Или я ошибаюсь?

Отправлено: 16:19, 26-05-2010 | #3


Аватара для [mzd]

Линуксоид-стакановец


Сообщения: 2391
Благодарности: 186

Профиль | Отправить PM | Цитировать


Советую ещё раз пересчитать количество if и fi. Они должны совпадать. Кроме того, рекомендую вынести обработчики Apache2 и Apache1.3 в отдельные функции. Код разгрузиться и его будет легче сопровождать.

-------
Живя в реальном мире, стремись к невероятному... Эрнесто Че Гевара
Everybody lies. (c) House M.D.
Базовая настройка Ubuntu. Документация для новичка.
Руководство по установке, начальной настройке и основам использования операционной системы Ubuntu


Отправлено: 16:24, 26-05-2010 | #4


Пользователь


Сообщения: 96
Благодарности: 2

Профиль | Отправить PM | Цитировать


Переписал в таком виде. Все if по-моему заканчиваются fi. Увы, я далеко не великий писатель скриптов, этой мой 3-4 скрипт за всё время. Где я ошибаюсь?
Выполняется код до этого момента:

if [ $REPLY2 = "y" ];
then
continue
else
exit 0
fi

Дальше прерывается. Такое чувство, что он не понимает ввод "y" и выполняет exit 0.



Код: Выделить весь код
#!/bin/sh

function dir {
echo changing home directory permissions:
echo $BASEDIR ...
chown svn.www $BASEDIR
echo $HOMEDIR ...
mkdir $HOMEDIR
chown svn.www $HOMEDIR
chmod 755 $HOMEDIR
mkdir $TMPDIR
chown svn.www $TMPDIR
chmod 1770 $TMPDIR
mkdir $LOGDIR
chown root.www $LOGDIR
chmod 755 $LOGDIR
cp $SKEL $HOMEDIR
              }

function apache2 {
echo
echo creating webserver configuration ...
sed s/XXXXXX/$PAGENAME/ < /etc/apache2/vserver.proto >$PAGENAME.http
echo please review new server configuration for $PAGENAME
sleep 2
vim $PAGENAME.http
echo appending new configuration to apache configuration file
cat $PAGENAME.http >>/etc/apache2/vhosts.d/vhosts.conf
rm -i $PAGENAME.http

                       }

function apache1 {

echo
echo creating webserver configuration ...
sed s/XXXXXX/$PAGENAME/ < /etc/apache1.3/vserver.proto >$PAGENAME.http
echo please review new server configuration for $PAGENAME
sleep 2
vim $PAGENAME.http
echo appending new configuration to apache configuration file
cat $PAGENAME.http >>/etc/apache1.3/httpd.conf
rm -i $PAGENAME.http
                      }

#End functions


#Select menu
echo Where do you want to create virtual host?
select opt in "Apache2" "Apache1.3"; do


#If Apache2
if [ "$opt" = "Apache2" ]; then

echo -n "Enter pagename:"
read PAGENAME
echo -n "Page will be called $PAGENAME ?"
read REPLY2
if [ $REPLY2 = "y" ];
then
  continue
else
  exit 0
fi

BASEDIR=/srv/virtual_2/$PAGENAME
HOMEDIR=$BASEDIR/./html
TMPDIR=$BASEDIR/tmp
LOGDIR=$BASEDIR/logs
GROUP=www
SHELL=/bin/bash
SKEL=/etc/web_skel/index.html


mkdir $BASEDIR

#Functions for Apache2
dir
apache2

#Apache2 restart
echo restarting apache
/etc/init.d/apache2 restart
echo Apache2 virtual host is done
exit


#If Apache1
elif [ "$opt" = "Apache1.3" ]; then
echo -n "Enter pagename:"
read PAGENAME1
echo -n "Page will be called $PAGENAME1?"
read REPLY2
if [ "$REPLY2" = "y" ];
then
  continue
else
  exit 0
fi

BASEDIR=/srv/virtual_1.3/$PAGENAME1
HOMEDIR=$BASEDIR/./html
TMPDIR=$BASEDIR/tmp
LOGDIR=$BASEDIR/logs
GROUP=www
SHELL=/bin/bash
SKEL=/etc/web_skel/index.html

mkdir $BASEDIR

#Functions for Apache1
dir
apache1

#Apache1 restart
echo restarting apache
/etc/init.d/apache1.3 restart

echo Apache2 virtual host is done

# If bad parameter
else
   clear
     echo You must enter 1 or 2

fi
done
Может быть я напрасно использую такую конструкцию?

Код: Выделить весь код
if [ "$opt" = "Apache2" ]; then
....
elif [ "$opt" = "Apache1.3" ]; then
....
else
   clear
     echo You must enter 1 or 2

fi

Отправлено: 16:53, 26-05-2010 | #5


Аватара для [mzd]

Линуксоид-стакановец


Сообщения: 2391
Благодарности: 186

Профиль | Отправить PM | Цитировать


Блин! Совсем забыл, что в BASH, как и в C оператор "=" означает присваивание, а для равенства используется оператор "==". У вас оператор "=" всегда true, поэтому и происходит остановка.

-------
Живя в реальном мире, стремись к невероятному... Эрнесто Че Гевара
Everybody lies. (c) House M.D.
Базовая настройка Ubuntu. Документация для новичка.
Руководство по установке, начальной настройке и основам использования операционной системы Ubuntu


Отправлено: 17:02, 26-05-2010 | #6


Пользователь


Сообщения: 96
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата [mzd:
]Совсем забыл, что в BASH, как и в C оператор "=" означает присваивание, а для равенства используется оператор "==". У вас оператор "=" всегда true, поэтому и происходит остановка. »
Попробовал

if [ "$REPLY2" == "y" ];

ничего не поменялось.

Отправлено: 17:07, 26-05-2010 | #7


Аватара для [mzd]

Линуксоид-стакановец


Сообщения: 2391
Благодарности: 186

Профиль | Отправить PM | Цитировать


А в других if = на == поменяли?

-------
Живя в реальном мире, стремись к невероятному... Эрнесто Че Гевара
Everybody lies. (c) House M.D.
Базовая настройка Ubuntu. Документация для новичка.
Руководство по установке, начальной настройке и основам использования операционной системы Ubuntu


Отправлено: 17:19, 26-05-2010 | #8


Пользователь


Сообщения: 96
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата [mzd:
]А в других if = на == поменяли? »
И на других поменял. Тут дело всё же не в ==
Тот же самый скрипт, но без

Код: Выделить весь код
echo Where do you want to create virtual host?
select opt in "Apache2" "Apache1.3"; do

if [ "$opt" = "Apache2" ]; then
.....
if
done
прекрасно работает. И условия так же с одинарным =
Тут что-то с логикой из за этого select блока.

Отправлено: 17:26, 26-05-2010 | #9


Аватара для [mzd]

Линуксоид-стакановец


Сообщения: 2391
Благодарности: 186

Профиль | Отправить PM | Цитировать


Кроме того, вместо if можно использовать case, а обработчики Apache2 и Apaceh1.3 тоже вынести в функции.

case равносильно if...elif...fi

-------
Живя в реальном мире, стремись к невероятному... Эрнесто Че Гевара
Everybody lies. (c) House M.D.
Базовая настройка Ubuntu. Документация для новичка.
Руководство по установке, начальной настройке и основам использования операционной системы Ubuntu


Отправлено: 17:28, 26-05-2010 | #10



Компьютерный форум OSzone.net » Linux и FreeBSD » Программирование в *nix » select + if

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Динамический Select darksmoke Вебмастеру 1 06-04-2008 22:15
Select с HTML кодом vadimiron Вебмастеру 10 19-02-2007 11:34
Тег <Select> Scorpion666 Вебмастеру 12 25-12-2006 21:46
тройной select E-mail Вебмастеру 12 10-04-2006 23:09
Вложенный SELECT в MySQL LEXX2002 Вебмастеру 7 06-09-2005 00:07




 
Переход