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
|