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
- 5346 megtekintés
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?
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
"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
- A hozzászóláshoz be kell jelentkezni
for i in 1 2 3 4; do echo -e "\x$((i+60))$i"; done
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Ha pontosan négy kiszolgáló van amihez csatlakozni kell és fájlt letölteni, akkor működni is fog a megfelelő módosításokkal, egyébként pedig ha változó hogy mennyi van, akkor én már AWK-val csinálnám meg.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni