[megoldva] bash for loop gány

Sziasztok!

~# cat szamlalo.sh

#!/bin/bash
for i in 0 .. 8;do
if feltétel;
then
done
else
{
műveletek
done
}
exit 0

~#bash szamlalo.sh
szamlalo.sh: line 5: szintaktikai hiba a váratlan done vezérjel körül
szamlalo.sh: line 5: ` done'

Nem tetszik neki a feltétel után a done :'( Goto kéne, de úgy tudom az itt nincs. Ötleteket szeretnék kérni, ki hogyan oldaná meg ezt?
Előre is köszönöm
Szerk
A megoldás:

#!/bin/bash
mkdir -p /tmp/nyomtato_szamlalo/
#nyomtatók ipcímei
CIM[0]=10.0.1.143
CIM[1]=10.0.1.147
CIM[2]=10.0.1.165
CIM[3]=10.0.1.13
CIM[4]=10.0.1.17
CIM[5]=10.0.1.200
CIM[6]=10.0.1.202
CIM[7]=10.0.1.64
CIM[8]=10.0.1.65
for i in 0 1 2 3 4 5 6 7 8 ; do
cd /tmp/nyomtato_szamlalo/
wget -d --output-file=/tmp/nyomtato_szamlalo/${CIM[$i]}.log --output-document=/tmp/nyomtato_szamlalo/oldal${CIM[$i]}.txt http://${CIM[$i]}/web/guest$
if [ $? != 0 ];
then
#wget sikertelen
continue
else
#wget sikeres

Hozzászólások

egyébként így fest a script nálam:
CIM[1]=ipcím
...
CIM[8]=ipcím
for i in 0 ..8 ; do
cd /tmp/nyomtato_szamlalo/
wget -d --output-file=/tmp/nyomtato_szamlalo/${CIM[$i]}.log --output-document=/tmp/nyomtato_szamlalo/oldal${CIM[$i]}.txt http://${CIM[$i]}/web/guest.cgi
grep 'HTTP/1.0 200 OK' ${CIM[$i]}.log >mylog.txt;
FILESIZE=$(stat -c%s mylog.txt)
if [ $FILESIZE = 0 ];
then
done
else
...
done
fi
exit 0
Tehát igazából azt szeretném tesztelni, hogy sikeres volt e a wget letöltés vagy sem, csak ilyen paraszt módszert találtam ki.


#!/bin/bash
mkdir -p /tmp/nyomtato_szamlalo/
#nyomtatók ipcímei
CIM[0]=10.0.1.143
CIM[1]=10.0.1.147
CIM[2]=10.0.1.165
CIM[3]=10.0.1.13
CIM[4]=10.0.1.17
CIM[5]=10.0.1.200
CIM[6]=10.0.1.202
CIM[7]=10.0.1.64
CIM[8]=10.0.1.65
for i in 0 1 2 3 4 5 6 7 8 ; do
#for i in 0 ; do
cd /tmp/nyomtato_szamlalo/
wget -d --output-file=/tmp/nyomtato_szamlalo/${CIM[$i]}.log --output-document=/tmp/nyomtato_szamlalo/oldal${CIM[$i]}.txt http://${CIM[$i]}/web/guest$
#grep 'HTTP/1.0 200 OK' ${CIM[$i]}.log >mylog.txt;
#FILESIZE=$(stat -c%s mylog.txt)
#if [ $FILESIZE = 0 ];
# then
# done
# else
...
done
fi
exit 0


for i in `seq 0 8` ; do
   …
   if [ -s mylog.txt ] ; then
      #létezik és nem nulla méretű a mylog.txt
      …
      continue
   else
      #nem létezik vagy null a mérete
      …
      continue
   fi
done

Kiegészítés: Ha a

fi

és

done

között nem csinálsz semmit, akkor a continue sem kell. Az ott lévő dolgokat „ugorná át” a continue hatására.

-----
"Ember embernek farkasa." Ezért aztán "Holló a hollónak nem vájja ki a szemét."

Ilyesmit szeretnél ha jól értem:

CIM=( ip1 ip2 ip3 ip4 )
for ip in ${CIM[@]}
do
cd /tmp/nyomtato_szamlalo/
res=`wget -d --output-file=/tmp/nyomtato_szamlalo/$ip.log --output-document=/tmp /nyomtato_szamlalo/oldal$ip.txt http://$ip/web/guest.cgi`
if [ "$res" =~ "*HTTP/1.0 200 OK*" ];
then
...
fi
done
exit 0

(A minta illesztésben nem vagyok biztos (=~ utáni rész), ezt majd a többiek javítják.

Ha így csinálom ezt kapom

line 18: 10.0.1.143: syntax error: invalid arithmetic operator (error token is ".0.1.143")

line 18: sorban van a wget ...
(error token is ".0.1.143") a legelső ipcím ahonnan letöltök 10.0.1.143
Ígyhát maradok a réginél az működik és még nem kényelmetlen.

Ehh... szerintem de a 'done' helyett 'fi' -t kellene hogy használj, és csak egy 'done' -nak kellene lennie a for lezárására.

így próbáltam , nem nyert

CIM[7]=10.0.1.64
CIM[8]=10.0.1.65
for i in 7 8 ; do
cd /tmp/nyomtato_szamlalo/
wget -d --output-file=/tmp/nyomtato_szamlalo/${CIM[$i]}.log --output-document=/tmp/nyomtato_szamlalo/oldal${CIM[$i]}.txt http://${CIM[$i]}/web/guest$
if [ $? != 0 ];
then
fi
else
műveletek
fi
done

eredmény:

szamlalo.sh: line 8: szintaktikai hiba a váratlan fi vezérjel körül
szamlalo.sh: line 8: ` fi'

Ha más módon tesztelsz, akkor nem kell

else

ág sem.


if [ -s /tmp/…/${CIM[$i]}.txt ]
   # a fájl mérete nagyobb nullánál
   műveletek
fi

Kieg.: A hiba azért volt, mert a

fi

az

if

-hez tartozik, így csak a legvégén kell.

-----
"Ember embernek farkasa." Ezért aztán "Holló a hollónak nem vájja ki a szemét."

break és continue

* Én egy indián vagyok. Minden indián hazudik.

Amúgy mi az a for i in 0 .. 8; do? Ennek az elemei:

0
..
8

Gondolom, ezt akartad:

for i in `seq 0 8`; do

vagy

for ((i=0; i<9; i++)); do

tr [:lower:] [:upper:] <<<locsemege
LOCSEMEGE