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
|