Re: lug-bg: yes/no Скрипт
- Subject: Re: lug-bg: yes/no Скрипт
- From: George Danchev <danchev@xxxxxxxxx>
- Date: Tue, 5 Oct 2004 20:10:56 +0300
On Tuesday 05 October 2004 15:56, Aleksander Valchev wrote:
Здрасти,
> Искам да ви питам дали този скрипт е горе-долу добре написан.
> Макар, че се вижда yesno е функция която задава въпрос на който може да се
> отговори само с y,Y,n,N. При въвеждане на друг символ въпросът се повтаря.
>
> Ако може да ми кажете дали е правилно и извикването на функцията,
> получаването на резултата от изпълнението й и обработката на резултата т.е.
> последните редове.
>
> Извинявам се за въпроса но script-ове не обичам да пиша (предпочитам C/C++
> и т.н.), но сега ми се налага, а нещо което не ти е толкова приятно
> по-трудно се справящ с него.
>
> Благодаря предварително за отговорите.
>
> А ето и част от скрипта.
>
> # Ask question (passed as parameter $1) and
> # returns 1 if user enter "y" or "Y" and 0 if user enter "n" or "N"
> # Do not allow to enter other characters (repeats question until y,Y,n,N)
> yesno()
> {
> Message=$1 # Question to ask
> while [ true ]; do
> echo -n "$Message "
> read answer
> if [ "$answer" ]; then
> case "$answer" in
> "y"|"Y") # User enter YES, return 1
> return 1
> ;;
> "n"|"N") # User enter NO, return 0
> return 0
> ;;
> *) # User do not know what he/she is enter, continue repeating
> echo "Please enter [y,Y] or [n,N] "
> ;;
> esac
> fi # user enter y, n ot something else
> done # while true
> }
>
>
> yesno "Are you ok? [y/n]"
> result="$?"
> if [ $result -eq 1 ]; then
> echo "OK"
> fi
Това е добре ;-) ... но аз си имам едно такова верую: ако може вместо да чакам
юзъра да се будалка с отговора и да се върти с цикъл, по-добре аз да му
предложа възможните отговори и да приключим сагата на първата итерация за да
продължим с обработването на задачите. Е това не винаги е подходящо де....
Например, може да използваш боксовете от dialog(1) и подобни:
#!/bin/bash
TMPFILE=reply
> $TMPFILE
dialog --menu "How R U Asker ? \n" 25 80 15 \
"ok" "I am OK" \
"notok" "I am not OK" 2> $TMPFILE
while [ 0 ] ; do \
if [ "`cat $TMPFILE`" = "" ] ; \
then > $TMPFILE ; \
exit 0
elif [ "`cat $TMPFILE`" = "ok" ] ; \
then > $TMPFILE ; \
dialog --msgbox "Said OK" 8 15 ; \
exit 0
elif [ "`cat $TMPFILE`" = "notok" ] ; \
then > $TMPFILE ; \
dialog --msgbox "Said not OK" 8 15 ; \
exit 0
else
exit 0
fi
> $TMPFILE ; \
done
Е, куцото тука е, че има малко bash-изъм и, че стойността на отговора се
предава през файл, че не мога се сетя как ще стане през променлива ... но
както и да е, де ... идеята е, че с диалог се дава шанс за избор само на
предварително избрани от нас входни данни и приключваме с една врътка.
И разбира се с --yesno ще сме още по-кратки и ясни ;-).
(няма башизъм (zsh, dash, ash) и писане по файлове ... е на {t}csh им не е
ясно това;-)
#!/bin/sh
dialog --yesno "Are you OK ?" 15 61
case $? in
0) echo "He is OK.";;
1) echo "He is not OK.";;
255) echo "He dislikes me. ESC pressed.";;
esac
Та, така ;-)
--
pub 4096R/0E4BD0AB 2003-03-18 <keyserver.bu.edu ; pgp.mit.edu>
fingerprint 1AE7 7C66 0A26 5BFF DF22 5D55 1C57 0C89 0E4B D0AB
============================================================================
A mail-list of Linux Users Group - Bulgaria (bulgarian linuxers).
http://www.linux-bulgaria.org - Hosted by Internet Group Ltd. - Stara Zagora
To unsubscribe: http://www.linux-bulgaria.org/public/mail_list.html
============================================================================
|