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  2010-12-12 14:55:26

  Zolnierzu - Użytkownik

Zolnierzu
Użytkownik
Skąd: Koszalin/Poznań
Zarejestrowany: 2007-09-22
Serwis

Bash - prosta pętla, wielki problem

Kod:

#!/bin/bash

pliki="pl hr cs da et fr hu it lt no pt ru"
kodowania=(cp1250 cp1250 cp1250 iso-8859-16 cp1257 iso-8859-13 cp1250 iso-8859-13 cp1257 iso-8859-16 iso-8859-13 cp1251 )
i=0
for x in $pliki ; do
    echo "plik $x kodowanie ${kodowania[i]}"
    i+=1
done

Na wyjściu mam:

plik pl kodowanie cp1250
plik hr kodowanie cp1250
plik cs kodowanie iso-8859-16
plik da kodowanie
plik et kodowanie
plik fr kodowanie
plik hu kodowanie
plik it kodowanie
plik lt kodowanie
plik no kodowanie
plik pt kodowanie
plik ru kodowanie

Co robię nie tak? :( + Bonusowe pytanie, dlaczego jeśli napiszę
for i in $kodowania ; do
    echo $i
done

to dostanę tylko pierwszy wynik?


Registered Linux user number 467822, (15-03-2008)

Offline

 

#2  2010-12-12 16:00:03

  kamikaze - Administrator

kamikaze
Administrator
Zarejestrowany: 2004-04-16

Re: Bash - prosta pętla, wielki problem

Offline

 

#3  2010-12-12 16:03:10

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: Bash - prosta pętla, wielki problem

Zolnierzu napisał(-a):

Kod:

#!/bin/bash

pliki="pl hr cs da et fr hu it lt no pt ru"
kodowania=(cp1250 cp1250 cp1250 iso-8859-16 cp1257 iso-8859-13 cp1250 iso-8859-13 cp1257 iso-8859-16 iso-8859-13 cp1251 )
i=0
for x in $pliki ; do
    echo "plik $x kodowanie ${kodowania[i]}"
    i+=1
done

Na wyjściu mam:

plik pl kodowanie cp1250
plik hr kodowanie cp1250
plik cs kodowanie iso-8859-16
plik da kodowanie
plik et kodowanie
plik fr kodowanie
plik hu kodowanie
plik it kodowanie
plik lt kodowanie
plik no kodowanie
plik pt kodowanie
plik ru kodowanie

Co robię nie tak? :(

Poprzedź i+=1 wyrażeniem let. bash jest dynamicznie typowany, ale w odróżnieniu od np. perl-a ma z tym więcej problemów niż to warte. Wyrażenie let informuje bash-a że ma do czynienia ze zmienną liczbową.

A dlaczego akurat przy czwartym się wysypuje? Pewnie sami developerzy bash-a nie wiedzą.

BTW bash 4.0 wprowadził tablice asocjacyjne.
Ale tablice w bash-u są tak cholernie wolne, że ja jak kiedyś potrzebowałem ich użyć, to ostatecznie zdecydowałem się na serię plików w /tmp (każdy plik był jednocześnie nazwą klucza i zawierał nazwy zmiennych z przypisanymi im wartościami — można potem odczytać poleceniem source).

+ Bonusowe pytanie, dlaczego jeśli napiszę
for i in $kodowania ; do
    echo $i
done

to dostanę tylko pierwszy wynik?

Bo odwołujesz się do tablicy w kontekście zmiennej.

Kod:

#zrób z tablicy zmienną:
kodowania="cp1250 cp1250 cp1250 iso-8859-16 cp1257 iso-8859-13 cp1250 iso-8859-13 cp1257 iso-8859-16 iso-8859-13 cp1251"
for j in $kodowania ; do
       echo $j
done

# albo powiedz bash-owi że ma do czynienia z tablicą:
kodowania=(cp1250 cp1250 cp1250 iso-8859-16 cp1257 iso-8859-13 cp1250 iso-8859-13 cp1257 iso-8859-16 iso-8859-13 cp1251 )
for j in ${kodowania[@]} ; do
       echo $j
done

Jest tam jakiś niuans różniący ${array[@]} od ${array[*]}, ale już nie pamiętam na czym on polega. Znajdziesz w dokumentacji.

Offline

 

#4  2010-12-12 17:40:49

  Zolnierzu - Użytkownik

Zolnierzu
Użytkownik
Skąd: Koszalin/Poznań
Zarejestrowany: 2007-09-22
Serwis

Re: Bash - prosta pętla, wielki problem

Dzięki Panowie, działa :) jednak nie taki bash fajny jak go malują


Registered Linux user number 467822, (15-03-2008)

Offline

 

Stopka forum

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