On Monday 24 January 2005 12:14, Alex 'CAVE' Cernat wrote:
> Care e cea mai simpla de a scrie un inc(x) in bash sau chiar mai mult;

Cea mai simpla si eficienta metoda ar fi folosind forma:

for ((i=0; i<n; i++)); do
  ...
done

Simpla - pentru ca e asemanatoare cu cea din limbajele de programare, 
eficienta - pentru ca din interpretarea lui 'for' rezulta cod care se executa 
"mai repede".

> momentan folosesc ceva de genul
>
> a=1
> while [ $a -le 255 ]; do
>     ... bla bla bla ...
>     a=$(( $a + 1 ))
> done

In primul rand daca scriptul e bash si nu vrei sa-l faci portabil in POSIX sh 
inlocuieste testele facute cu [...] cu [[...]]. 

[ este acelasi lucru cu /bin/test deci necesita executia unui alt proces care 
sa faca evaluarea. "[[" este evaluat intern de bash deci va da un rezultat 
mai rapid.

Rescrierea while-ului de mai sus intr-o forma mai eficienta ar fi:

a=1
while [[ $a -le 255 ]]; do
 ...
 ((a++))
done

La fel, folosirea formei "((a++))" este mai eficienta decat echivalentul 
"a=$((a+1))".

> ar mai fi un
>
> for a in `seq 1 255` do; ..... ; done
>
> dar care afaik merge doar pentru din 1 in 1, daca vreau din 3 in 3 pa

Dupa cum au spus Mituc si Dan poti folosi 'seq' pentru a genera o lista de 
elemente (nu neaparat consecutive). Totusi 'seq' prezinta 2 dezavantaje:

1. necesita executarea in prealabil a comenzii 'seq' pentru a genera lista de 
elemente (un minus de viteza)
2. in cazul unei liste mai mari, rezultatul lui 'seq' va ocupa multa memorie


Bineinteles daca ajungi sa umbli la asemenea performante probabil solutia e sa 
rescrii codul in C, dar totusi nu strica sa stii sa scrii cod eficient direct 
in bash :)


Mihai

--- 
Detalii despre listele noastre de mail: http://www.lug.ro/


Raspunde prin e-mail lui