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!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
#!/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?
Offline
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 doneNa 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.
#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
Strony: 1