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 17:09:17 +0300

On Tue, Oct 05, 2004 at 04:35:01PM +0300, Peter Pentchev wrote:
> On Tue, Oct 05, 2004 at 03:56:25PM +0300, Aleksander Valchev wrote:
> > Искам да ви питам дали този скрипт е горе-долу добре написан.
> > Макар, че се вижда yesno е функция която задава въпрос на който може да се 
> > отговори само с y,Y,n,N. При въвеждане на друг символ въпросът се повтаря. 
> > 
> > Ако може да ми кажете дали е правилно и извикването на функцията,
> > получаването > на резултата от изпълнението й и обработката на
> > резултата т.е. последните редове. 
> [snip]
> >     while [ true ]; do
> 
> Тук ще е малко по-правилно "while true; do" - операторът [ ] или test се
> използва, когато.. ами когато искаш да провериш нещо, което е описано в
> документацията на [ ] (или test) :)

Малко допълнително пояснение: операторите if и while са много глупави.
Самите те не се опитват изобщо да разбират каквато и да е граматика -
равно, различно, по-голямо, празно, пълно - изобщо не ги интересува.
Единственото, което тези оператори правят, е да изпълнят *външна
команда* и да проверят дали тя връща 0 като резултат.

В най-честно използваните си видове тези оператори изглеждат така:

1. if [ ... ]; then
      ...
   евентуално else ...
   fi

   В този вид if изпълнява командата [, която при някои шелове е
   вграденя, а при други се използва /bin/[ (да, ако не вярвате,
   проверете - при кажи-речи всички Unix-based OS's в /bin има файл,
   който се казва "[").  Тази команда прави почти същото като командата
   test, която пак при някои шелове е вградена, а при други се изпълнява
   от /bin/test - и това, което прави, е да проверява (test де, test)
   дали зададеното условие, изразено с едно- или двуаргументни
   оператори, е вярно или не.  Ако условието е вярно, test връща exit
   code 0; ако не е, test обикновено връща 1, но за всеки случай провери
   manual page.  Единствената разлика между [ и test е, че [ изисква
   последният й параметър да бъде ], за да се запази идиомът "[ усл ]".

   Та значи, if изпълнява командата [, след което проверява дали тя е
   върнала резултат 0.  Ако е върнала 0, if изпълнява това, което е след
   then; ако не е върнала 0, или не прави нищо, или изпълнява това,
   което е зададено между else и fi.

2. while [ ... ]; do
      ...
   done

   Тук while изпълнява същото, което прави и if горе - всеки път, когато
   трябва да реши дали да изпълни тялото на цикъла, първо изпълнява
   командата [ с подадените й параметри.  Ако [ върне 0, while изпълнява
   цикъла и опитва пак.  В момента, в който [ върне нещо, различно от 0,
   while завършва и шелът изпълнява това, което следва 'done'.
   
3. while true; do
     ...
   done

   В този вид while всеки път изпълнява командата true и проверява
   връщания от нея резултат.  Тъй като той винаги е 0, while всеки път
   изпълнява тялото на цикъла още веднъж.

Та така.. надявам се сега да е станало малко по-ясно защо while true; do
се пише така и защо if [ -n "$answer" ]; then се пише така :)

Между другото, и в if, и в while можеш да използваш каквито и да е
команди - изобщо не си ограничен до [ ], test и true.  Аз примерно често
правя неща като:

  if fgrep -q blah /tmp/foo; then echo 'Found it!'; fi

което прави същото като:

  fgrep -q blah /tmp/foo && echo 'Found it!'

но е малко по-прегледно, а и може да бъде развито примерно до

  if fgrep -q blah /tmp/foo; then
     echo 'Found it!'
  else
     echo 'No luck...' 1>&2
  fi

В този ред на мисли, [ ] може да бъде
използван и извън if/while - друго нещо, което често правя, е примерно:

  [ -f ~/.shrc-agent ] && . ~/.shrc-agent

което прави същото като if [ -f ~/.shrc-agent ]; then . ~/.shrc-agent;
fi, но е малко по-прегледно :P

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

-- 
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
Do you think anybody has ever had *precisely this thought* before?

Attachment: pgpUEFFWOKR_p.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.