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 [EMAIL PROTECTED] [EMAIL PROTECTED] [EMAIL PROTECTED] 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.
pgpd4dCgc1eSz.pgp
Description: PGP signature
