sh több for ciklus értékei

Sziasztok!

Bash ben szeretném, ha a következő dolog menne :

#!/bin/sh
for a in a b c d
do
for b in 1 2 3 4
do
echo $a$b
done
done

Ezzel kimenet : a1 a2 a3 a4 b1 b2 b3 ...

Én azonban azt szeretném ha a kimenet valahogy ennek megfelelően jelenne meg :
a1 b2 c3 d4

Esetleg ciklus számláló kellene ? pls segítsetek.

köszi

Hozzászólások

for a in a1 b2 c3 d4, vagy nem értem, miért kell két egymásba ágyazott ciklus, ha nem akarod az összes értéket végigjárni?

köszi a válaszokat de nem segitett. leírom részletesebben :

sql lekérdezésből jönnek az adatok az alábbi minta alapján :

kiszolgalo felhasznalonev jelszo fájl kiszolgalo2 felhasznalonev2 jelszo2 fájl2 kiszolgalo3 felhasznalonev3 jelszo3 fájl3 ...

ezeket cut al szétválasztottam.

FTPHOST=$(echo $sqlresults | cut -d ' ' -f1,5,9);
USER=$(echo $sqlresults | cut -d ' ' -f2,6,10);
PASSWD=$(echo $sqlresults | cut -d ' ' -f3,7,11);
FILENAME=$(echo $results | cut -d ' ' -f4,8,12);

pl : echo $FTPHOST ra kiadja a kiszolgálóneveket egymás után : kiszolgalo kiszolgalo2 kiszolgalo3

A következő részt nem sikerül összehoznom :

for kiszolgalo in $FTPHOST;do
for username in $USER;do
for password in $PASSWD;do
for filenam in $FILENAME;do

ftp -pnv <
open $kiszolgalo
user $username $password
get $filenam
EOF

done
done
done
done

A cél az lenne, hogy egyesével csatlakozzon fel, és szedje le az adatbázisban megadott kiszolgálóról az adott filet.

Na itt az én megoldásom:


#!/bi/bash

array1=( a b c d )
array2=( 1 2 3 4 )

for ((i=0;i<4;i++))
        do
                echo -n ${array1[$i]}${array2[$i]};
                echo -n " ";
        done

echo

exit 0

"Esetleg ciklus számláló kellene ?"
Igen.


#!/bin/sh

i=0
for a in a b c d
do
  i=$((i+1))
  echo -n $a$i" "
done
echo
for i in 1 2 3 4; do echo -e "\x$((i+60))$i"; done

köszi a válaszokat de nem segitett. leírom részletesebben :

sql lekérdezésből jönnek az adatok az alábbi minta alapján :

kiszolgalo felhasznalonev jelszo fájl kiszolgalo2 felhasznalonev2 jelszo2 fájl2 kiszolgalo3 felhasznalonev3 jelszo3 fájl3 ...

ezeket cut al szétválasztottam.

FTPHOST=$(echo $sqlresults | cut -d ' ' -f1,5,9);
USER=$(echo $sqlresults | cut -d ' ' -f2,6,10);
PASSWD=$(echo $sqlresults | cut -d ' ' -f3,7,11);
FILENAME=$(echo $results | cut -d ' ' -f4,8,12);

pl : echo $FTPHOST ra kiadja a kiszolgálóneveket egymás után : kiszolgalo kiszolgalo2 kiszolgalo3

A következő részt nem sikerül összehoznom :

for kiszolgalo in $FTPHOST;do
for username in $USER;do
for password in $PASSWD;do
for filenam in $FILENAME;do

ftp -pnv
open $kiszolgalo
user $username $password
get $filenam

done
done
done
done

A cél az lenne, hogy egyesével csatlakozzon fel, és szedje le az adatbázisban megadott kiszolgálóról az adott filet.

for kiszolgalo in $FTPHOST;do
for username in $USER;do
...
done
done

Ezt először értsd meg, hogy mit csinál! Azt csinálja, hogy az FTPHOST elemein végigmegy, és MINDEN elemre egyesével végigmegy a USER elemein is. De te nem azt akarod, hogy minden FTPHOST-ra minden USER bejelentkezzen!
Szerintem ulysses megoldása lesz jó.

De a cut helyett nem lenne jobb sed-et használni? Mert biztos, hogy csak három darab adatnégyest kapsz?
FTPHOST=$(echo $sqlresults | sed -n "1~4p")
USER=$(echo $sqlresults | sed -n "2~4p")
stb.

Tehát: 2~4: a 2. elemnél kezdi, és minden negyediket kiír.

Ahogy uzsolt is írta, értsd meg a for, és az egymásba ágyazott for lényegét.

Többféle módon is el lehet jutni a célodig, de itt egy lehetséges megoldás. Az sqlbol az általad adott formátumú file:



#!/bin/sh

sed 's/$/ /' sqlbol | (while read -d ' ' kiszolgalo ; read -d ' ' username ; read -d ' ' password ; read -d ' ' filenam
do
  echo "open $kiszolgalo"
  echo "user $username $password"
  echo "get $filenam"
done ; echo "quit") | ftp -pnv

Alapszintű magyarázat: újsor helyett szóközzel szeparáltan beolvassuk a 4 változót, ebből kiíratjuk a megfelelő FTP parancsokat, és ezt ismételgetjük, amíg sikeres a beolvasás. A végére biggyesztünk még egy kilépést. Ahhoz, hogy a szóközzel való szeparálásos beolvasásnál a sorban utolsó szó is jó helyre kerüljön, seddel minden sor végéhez egy szóközt fűzünk. Ebből táplálkozik a ciklusbeli beolvasás. A kimenetét pedig átadjuk az ftp programnak. Ne csak lemásold, hanem értsd is meg.

Ugyanennek egy wgetes változata lehetne ez is:


#!/bin/sh

sed 's/$/ /' sqlbol | while read -d ' ' kiszolgalo ; read -d ' ' username ; read -d ' ' password ; read -d ' ' filenam
do
  wget "ftp://${username}:${password}@${kiszolgalo}/${filenam}"
done

Szerintem erőből akarsz megoldani olyat, amit már megoldottak neked.
Nézd meg ezt:
http://www.postgresql.org/docs/current/static/tablefunc.html

Excel, access pivot tábla címen kínálja a megoldást. Olyan lekérdezést kell összerakni, mely egy oszlopban/mezőben található értékeket mezőcímkéknek használ az eredmény megjelenítésekor. Legalábbis ezt olvastam ki abból amiket írtál.

Lehet, hogy tévedek, illetve ismeretlen számomra az adatbáziskezelőd. Ennek tájszólásától függhet, hogy hogyan oldható meg.

Linuxscripting

Tobben is irtak, hogy valoszinuleg nem erted az egymasba agyazott for ciklusok mukodeset. Leirom egyszeru nyelven es lassan:
tehat, mind kozismert, a for ciklus vegigballag az elemein, minden elemmel lefuttatja a ciklusmagot, majd kilep.
Ha a ciklus mag tartalmaz egy masik ciklust, akkor az is lefut a sajat utemeben, majd kilep.
Ennek az a lenyege, hogy a kulso ciklus nem tud arrol, hogy neki belul van egy masik ciklusa, o ugyanugy tovabblep a kovetkezore, es lefuttatja a _teljes_ belso ciklust, az elejetol kezdve (ugye egyszer mar atporgettuk a belso ciklust, igy az most nullarol _kell_ hogy induljon).

Pelda:


 - Amig van viz a tengerben:
   - Amig el nem faradsz:
     - Vegy egy vodor vizet a tengerbol, es ontsd bele egy feneketlen kadba.

Elfaradsz, lefekszel, de a kulso ciklus (a tenger) errol nem fog tudni, o masnap reggel sem lesz szaraz.

Vagyis, neked az kell, hogy fogj egy indexet, es ezzel a kozos indexszel szedd elo a tombokbol a valtozokat.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal