Linux-Bulgaria.ORG
навигация

 

начало

пощенски списък

архив на групата

семинари ...

документи

как да ...

 

 

Предишно писмо Следващо писмо Предишно по тема Следващо по тема По Дата По тема (thread)

Re: lug-bg: yes/no Скрипт


  • Subject: Re: lug-bg: yes/no Скрипт
  • From: Peter Pentchev <roam@xxxxxxxxxxx>
  • Date: Tue, 5 Oct 2004 16:35:01 +0300

On Tue, Oct 05, 2004 at 03:56:25PM +0300, Aleksander Valchev wrote:
> Искам да ви питам дали този скрипт е горе-долу добре написан.
> Макар, че се вижда yesno е функция която задава въпрос на който може да се 
> отговори само с y,Y,n,N. При въвеждане на друг символ въпросът се повтаря. 
> 
> Ако може да ми кажете дали е правилно и извикването на функцията,
> получаването > на резултата от изпълнението й и обработката на
> резултата т.е. последните редове. 
[snip]
> # 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

Аз лично това бих го написал като Message="$1" за всеки случай, макар че
и така работи на Bourne-like шеловете, на които го пробвах.

>     while [ true ]; do

Тук ще е малко по-правилно "while true; do" - операторът [ ] или test се
използва, когато.. ами когато искаш да провериш нещо, което е описано в
документацията на [ ] (или test) :)

>  echo -n "$Message "
>  read answer
>  if [ "$answer" ]; then

Тук по-добре направи if [ -n "$answer" ] вместо if [ "$answer" ], защото
-n е операторът, който се използва от test (или [ ]) за проверка дали
даден низ съдържа поне един символ (обратното на -z).

>      case "$answer" in
>   "y"|"Y") # User enter YES, return 1
>       return 1
>       ;;
>   "n"|"N") # User enter NO, return 0
>       return 0

Хмм..  По принцип за exit code на програми под Unix се използва
конвенция, при която 0 показва успех, а ненулев резултат - нещо друго.
Някои хора използват тази конвенция и при shell script functions, така
че семантиката на $? да се запази, независимо от това дали извикваш
функция или външна програма - ако $? е 0, значи всичко е наред.  Това
обаче си е изцяло твой избор :)  Само като datapoint, програмата dialog,
която прави и това освен всичко друго, наистина връща 0, когато
потребителят натисне бутона Yes (или OK, или каквото там е зададено като
"правилен" бутон).

>       ;;
>   *) # User do not know what he/she is enter, continue repeating
>       echo "Please enter [y,Y] or [n,N] "

Според мен частта с "*)" можеш да я пропуснеш, а това echo да го
преместиш след fi-то, така че да се показва винаги, когато се налага да
повториш - независимо дали потребителят е въвел нещо, различно от
[YyNn], или просто не е въвел нищо.

>       ;;
>      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

А тук можеш да си спестиш result и да провериш директно if [ $? -eq 1 ],
освен ако, разбира се, не искаш да запазиш резултата и за по-нататъшна
употреба :)

Поздрави,
Петър

-- 
Peter Pentchev	roam@xxxxxxxxxxx    roam@xxxxxxxx    roam@xxxxxxxxxxx
PGP key:	http://people.FreeBSD.org/~roam/roam.key.asc
Key fingerprint	FDBA FD79 C26F 3C51 C95E  DF9E ED18 B68D 1619 4553
When you are not looking at it, this sentence is in Spanish.

Attachment: pgpI7cLUjiNxL.pgp
Description: PGP signature



 

наши приятели

 

линукс за българи
http://linux-bg.org

FSA-BG
http://fsa-bg.org

OpenFest
http://openfest.org

FreeBSD BG
http://bg-freebsd.org

KDE-BG
http://kde.fsa-bg.org/

Gnome-BG
http://gnome.cult.bg/

проект OpenFMI
http://openfmi.net

NetField Forum
http://netField.ludost.net/forum/

 

 

Linux-Bulgaria.ORG

Mailing list messages are © Copyright their authors.