Nowe posty

Autor Wątek: Poprawna forma zapisu  (Przeczytany 3470 razy)

filon92

  • Gość
Poprawna forma zapisu
« dnia: 2013-07-20, 10:40:51 »
Witam serdecznie,

Mam następujący kod:

for (( i=1; i <= 5; i++ ))
do

tablica$i=(1 2 3)

echo ${tablica$i
  • }


done

W jaki sposób to zapisać aby było poprawnie?
Z góry dziękuję za pomoc

alvaro

  • Gość
Poprawna forma zapisu
« Odpowiedź #1 dnia: 2013-07-20, 13:04:19 »
Może lepiej napisz co chcesz uzyskać bo szczerze mówiąc to nie mam pojęcia co chciałeś tym osiągnąć.

filon92

  • Gość
Poprawna forma zapisu
« Odpowiedź #2 dnia: 2013-07-22, 07:14:54 »
Chciałem, aby za każdym obejściem pętli wyświetliło mi zawartość tablicy. Przy pierwszym obejściu "tablica1" przy drugim obejściu "tablica2" przy kolejnym "tablica 3" itd. Po prostu chciałem, żeby przy poszczególnych obejściach wyświetlało elementy różnych tablic: tablica1, tablica2, tablica3, tablica4, tablica5 a jednocześnie, żeby przy każdym obejściu przypisać tym tablicą elementy 1, 2, 3. Czy da się to tak zrobić?

alvaro

  • Gość
Poprawna forma zapisu
« Odpowiedź #3 dnia: 2013-07-22, 15:55:03 »
Cytat: filon92
Chciałem, aby za każdym obejściem pętli wyświetliło mi zawartość tablicy. Przy pierwszym obejściu "tablica1" przy drugim obejściu "tablica2" przy kolejnym "tablica 3" itd. Po prostu chciałem, żeby przy poszczególnych obejściach wyświetlało elementy różnych tablic: tablica1, tablica2, tablica3, tablica4, tablica5 a jednocześnie, żeby przy każdym obejściu przypisać tym tablicą elementy 1, 2, 3. Czy da się to tak zrobić?
Da się, ale nadal nie widzę w tym większego sensu.
Co chciałeś tym osiągnąć? Do czego Ci to jest potrzebne?

Wersja rozpisana
#!/usr/bin/env bash

m=1
n=5

tablica=( )
for ((i = m; i <= n; i++));
do
  tablica+=("tablica$i=( 1 2 3 )")
done

for i in "${!tablica[@]}"
do
  echo -n "k: $i; "
  echo "v: ${tablica[$i]}"
done
echo

# utworzenie tablic: tablica1, ..., tablica5
for element in "${tablica[@]}"
do
  eval "$element"
done

# wyswietlenia zawartosci tablic: tablica1, ..., tablica5
for ((i = m; i <= n; i++))
do
  tab="tablica$i[@]"
  echo -n "tablica$i: "
  echo ${!tab}
  #for j in "${!tab}"; do echo -n "$j "; done; echo
done
wklejka

# ./marray1.bash 
k: 0; v: tablica1=( 1 2 3 )
k: 1; v: tablica2=( 1 2 3 )
k: 2; v: tablica3=( 1 2 3 )
k: 3; v: tablica4=( 1 2 3 )
k: 4; v: tablica5=( 1 2 3 )

tablica1: 1 2 3
tablica2: 1 2 3
tablica3: 1 2 3
tablica4: 1 2 3
tablica5: 1 2 3
Wersja kompaktowa
#!/usr/bin/env bash

m=1
n=5

for ((i = m; i <= n; i++))
do
  cmd="tablica$i=( 1 2 3 )"
  eval "$cmd"
  tab="tablica$i[@]"
  echo -n "tablica$i: "
  echo ${!tab}
  #for j in "${!tab}"; do echo -n "$j "; done; echo
done
wklejka

# ./marray2.bash 
tablica1: 1 2 3
tablica2: 1 2 3
tablica3: 1 2 3
tablica4: 1 2 3
tablica5: 1 2 3
Tablice wielowymiarowe

Niestety, bash nie wspiera tablic wielowymiarowych.

Można obchodzić to ograniczenia na różne sposoby.

Jednym z nich jest odpowiednie wykorzystanie tablic asocjacyjnych wprowadzonych w czwartej wersja Basha (zwróć uwagę na klucz):
#!/usr/bin/env bash

declare -A tablica

for i in {1..5}
do
  #tablica["$i,1"]="1"; tablica["$i,2"]="2"; tablica["$i,3"]="3"
  for j in {1..3}
  do
    klucz="$i,$j"
    tablica[$klucz]="$j"
  done

  echo -n "tablica[$i]: ( "
  for j in {1..3}
  do
    klucz="$i,$j"
    echo -n "${tablica[$klucz]} "
  done
  echo ")"
done
wklejka

# ./marray3.bash 
tablica[1]: ( 1 2 3 )
tablica[2]: ( 1 2 3 )
tablica[3]: ( 1 2 3 )
tablica[4]: ( 1 2 3 )
tablica[5]: ( 1 2 3 )