On Thu, Oct 07, 2004 at 04:13:22PM +0300, Georgi Genov wrote:
за да не дразня програмистите ще се корегирам :)
#!/bin/sh
read_answer() {
echo -n "Please enter [y,Y] or [n,N] "
read answer
}
result() {
echo $1
if [ ! $1 = "Other" ]; then
Между другото, само като идейка: в shell scripting понякога е добра
идея да слагаш "" около променливи, за които не си съвсем сигурен какво
точно ще ти бъде подадено. Малка демонстрацийка малко по-долу...
exit 0
fi
}
read_answer
while [ ! $answer = [yY] ] & [ ! $answer = [nN] ]; do
Ъъъъъ... като оставим настрана това с кавичките, това почти няма шанс
да работи... Като начало, това & трябва да бъде &&, защото & няма да
направи логически 'и', ами ще background-не първия test, и не е ясно
точно какво ще се случи после :) А иначе [ ] a.k.a. test май в никоя
реализация, до която мога да се докопам сега, не може да се справи с
конструкция от типа нещо = [character class]; може би имаш предвид
if [ `expr "$answer" : '[Yy]'` = '0' ] ? :)
Да видим сега какво имам предвид с това с кавичките:
[roam@straylight ~]> cat > foo.sh
#!/bin/sh
read answer
if [ $answer = 'Y' ]; then
echo 'Yuppie yay!'
fi
[roam@straylight ~]> sh foo.sh
Y
Yuppie yay!
[roam@straylight ~]> sh foo.sh
N
[roam@straylight ~]>
Дотук добре, разпознава 'Y', не разпознава 'N'. Сега обаче...
[roam@straylight ~]> sh foo.sh
yuppity yup
[: yuppity: unexpected operator
[roam@straylight ~]>
Тук май нещо се счупи :) А я да видим какво можем да направим с test?
[roam@straylight ~]> sh foo.sh
1 = 1 -o N
Yuppie yay!
[roam@straylight ~]>
Ухаааа... съвсем го шашнах :) А нещо друго?
[roam@straylight ~]> sh foo.sh
-f /etc/istheresuchafile -o N
[roam@straylight ~]> sh foo.sh
-f /etc/passwd -o N
Yuppie yay!
[roam@straylight ~]>
Ето как с малко невнимание можем да пуснем някой да се разхожда из
системата и да събира информация, която не му се полага :)
case "$answer" in
Аааааа така - за това става дума. Навсякъде, където използваш $answer,
го слагай в кавички, да не стават грешки - освен ако, разбира се, не
искаш наистина да го интерпретираш така, с интервалите, които може да
съдържа.
[Yy]*)
result Yes
break
;;
А това пък е правилният начин да провериш дали нещо започва с Y или y,
горният вариант с if [ "$answer" = '[Yy]' ] просто няма да работи.
Поздрави,
Петър