Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2008-04-05 21:04:58

  Gryzon - Użytkownik

Gryzon
Użytkownik
Skąd: Trójmiasto
Zarejestrowany: 2007-06-23

BASH - Pętla w pętli i zmienna kontrolna

Witam serdecznie, mam problem z przekazaniem wartości zmiennej w dwóch pętlach

Dla przykładu

Kod:

zmienna=1000 #Definiuje zmienną kontrolną

for ... # Pierwsza pętla (wykonuje się 3 razy)

do

   while ... # druga pętla (wykonuje się 10 razy)
   do

   echo $zmienna

  zmienna=$((zmienna+1))

  done


done # koniec pierwszej pętli

Mianowicie jak skrypt pierwszy raz wejdzie do pętli while to poprawnie wyświetli wartości od 1000 do 1010, natomiast gdy wejdzie do pętli po raz drugi lub trzeci to zamiast wyświetlać kolejne wartości (1011 do 1030) to wyświetla tak jak za pierwszym razem od 1000 do 1010

Wygląda to jakby po ponownym wykonaniu pętli for zmienna wracała do wartości zadefiniowanej na początku


"Nie ma rzeczy niemożliwych, są tylko takie, których człowiek nie nauczył się jeszcze robić"
A. Einstein

Offline

 

#2  2008-04-06 03:23:26

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: BASH - Pętla w pętli i zmienna kontrolna

nie chodzi o petle for tylko while - ona ogranicza zasieg zmiennych ...


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#3  2008-04-06 09:34:02

  Gryzon - Użytkownik

Gryzon
Użytkownik
Skąd: Trójmiasto
Zarejestrowany: 2007-06-23

Re: BASH - Pętla w pętli i zmienna kontrolna

To tak jak przypuszczałem że po powrocie to pętli for zmienna nie ma wartości z pętli while, jest jakaś możliwość zmiany takiego działania, np. poprzez inną definicję zmiennej? Narazie pokonałem problem poprzez zapisanie wartości do pliku tymczasowego, ale chciałbym nie używać takiego rozwiązania.


"Nie ma rzeczy niemożliwych, są tylko takie, których człowiek nie nauczył się jeszcze robić"
A. Einstein

Offline

 

#4  2008-04-06 18:03:46

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: BASH - Pętla w pętli i zmienna kontrolna

troche namieszalem ... ale juz spiesze z poprawka (tez to przerabialem i ez to rozwiazywalem piszac do pliku, ale przypomniec sobie o co w tym dokladnie biegalo jakos ciezko) ...

nie chodzi nawet o sama petle for - zapewne masz w skrypcie

Kod:

echo "cos tam cos" | while read f; do

i tutaj lezy problem ze w skutek operowania na przekierowywaniu strumieni taka petla for jest wykonywana w procesie potomnym wzgledem skryptu a nie w samym skrypcie - mamy tutaj problem przekazania zmiennej srodowiskowej do procesu macierzystego

przyklad pokazujacy jak to dziala:

Kod:

zmienna=1000; ps x -l | tail; echo -e "ttt\nooo" | while read f; do zmienna=$((zmienna+1)); echo " $zmienna"; ps x -l | tail; done; echo $zmienna

"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)

[ Generated in 0.010 seconds, 11 queries executed ]

Informacje debugowania

Time (s) Query
0.00012 SET CHARSET latin2
0.00004 SET NAMES latin2
0.00102 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.138.36.168' WHERE u.id=1
0.00107 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.138.36.168', 1732300173)
0.00056 SELECT * FROM punbb_online WHERE logged<1732299873
0.00092 SELECT topic_id FROM punbb_posts WHERE id=87861
0.00111 SELECT id FROM punbb_posts WHERE topic_id=11125 ORDER BY posted
0.00081 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=11125 AND t.moved_to IS NULL
0.00005 SELECT search_for, replace_with FROM punbb_censoring
0.00107 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=11125 ORDER BY p.id LIMIT 0,25
0.00132 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=11125
Total query time: 0.00809 s