Nowe posty

Autor Wątek: bash tablice  (Przeczytany 3690 razy)

kordi

  • Gość
bash tablice
« dnia: 2012-09-01, 20:56:47 »
Witam!
Mam kilka plikow z danymi: lili.txt, lina.txt, lik.txt, , kk.txt, krb.txt
Chcialbym wczytac te dane do tablicy, tak aby powstalo 5 niezaleznych tablic.

Kombinuje, ale niestey nie wychodzi mi to.

Oto co mi sie udalo stworzyc:

  for x in lili lina lik kk krb
   do

  zmienna=()
  k=0
  for i in `cat '$x'_data.txt`
  do
  '$x'_zmienna[k]=$i
   k=$((k+1))
  done
done
Niestey taki sposob nie dziala.
Czy moglaby liczyc na Wasza pomoc, jak rozwiazac ten problem?

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
bash tablice
« Odpowiedź #1 dnia: 2012-09-01, 22:55:28 »
Może spróbuj coś z:
a=( $( cat file.txt ) )
tak podstawiasz dane z file.txt bezpośrednio do tablicy a.

kordi

  • Gość
bash tablice
« Odpowiedź #2 dnia: 2012-09-02, 09:32:11 »
Zmodyfikowalam troche swoj kod :

for j in lili lina
   do
     zmienna=()
     k=0
      for i in `cat "${j}"_data.txt`
       do
         name="${j}zmienna"
         "$name[$k]=$i"
         k=$((k+1))
      done
    done
i mam nadal problem. Wyskakuje mi blad w linii
 "$name[$k]=$i"
:
lilizmienna[0]=165.5: command not found
lilizmienna[1]=163.4: command not found
lilizmienna[2]=160.9: command not found
itd.
Czyli jakby chcial podstawic, ale jakos nie moze. Czy macie jakis pomysl dlaczego tak sie dzieje i jak to mozna poprawic?

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
bash tablice
« Odpowiedź #3 dnia: 2012-09-02, 10:38:41 »
Liniię
"$name[$k]=$i"
interpretuje jako ciąg znaków (lub jedną komendę).

Możesz zamienić ją na:
eval "$name[$k]=$i"
Wtedy ją sparsuje i wykona.

kordi

  • Gość
bash tablice
« Odpowiedź #4 dnia: 2012-09-02, 10:59:34 »
Poszlo! Wielkie dzieki za pomoc! :)

kordi

  • Gość
bash tablice
« Odpowiedź #5 dnia: 2012-09-02, 11:48:19 »
Teraz probuje odwolac sie do utorzonych tablic poza petla:

echo ${"${x}${y}"_dim[1]}
i w takim przypadku wyskakuje blad: bad substitution

jesli napisze
 ${lili_dim[1]}
nic nie wyswietla.


Bede wdzieczna za wskazowke, jak to poprawic.

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
bash tablice
« Odpowiedź #6 dnia: 2012-09-02, 20:16:06 »
Jeżeli chodzi o pierwszy przykład, to możesz to zrobić na przykład przez odwołanie pośrednie (z wykrzyknikiem):

z=${x}${y}_dim[1]
echo ${!z}
Jeżeli chodzi o drugi problem, to trudno powiedzieć, bo nie zauważyłem, żebyś gdzieś ustawiała lili_dim[1].

---
Poniżej masz prosty skrypt, który pokazuje w jaki sposób można odwoływać się do tablic w podobnych sytuacjach. Może Ci się na coś przyda.
#!/bin/bash

x=lolly
y=pop

# Ustawienie wartosci
eval "${x}${y}_dim[0]=zero"
eval "${x}${y}_dim[1]=jeden"
eval "${x}${y}_dim[2]=dwa"

echo 'Test:' ${lollypop_dim[2]}


# 1) Rzutowanie calej tablicy
#   $z - nazwa tablicy jako ciag znakow zakonczona [*]
#   $tablica - tablica po rzutowaniu
z=${x}${y}_dim[*]
tablica=(${!z})

echo 'tablica[0]=' ${tablica[0]}
echo 'tablica[1]=' ${tablica[1]}
echo 'tablica[*]=' ${tablica[*]}


# 2) Odwolanie do konkretnego elementu tablicy
t1=${x}${y}_dim[2]

echo 'wartosc t1=' ${!t1}


# 3) Odwolanie posrednie z uzyciem eval
#    backslash przed znakiem dolara powoduje, ze ciag rozwijany jest
#    do nazwy elementu, a nie jego wartosci. W tym przypadku do
#    eval "t2=${lollypop_dim[0]}"

eval "t2=\\${${x}${y}_dim[0]}"

echo 'wartosc t2=' ${t2}

# 4) Odwolanie posrednie z uzyciem eval oraz echo
#    Podobny przyklad, bez podstawienia w eval.

t3=$( eval "echo \\${${x}${y}_dim[1]}" )

echo 'wartosc t3=' ${t3}

kordi

  • Gość
bash tablice
« Odpowiedź #7 dnia: 2012-09-02, 20:30:45 »
Serdecznie dziekuje za pomoc! :)