Newsgroup: it.comp.os.linux.iniziare
Titolo: limite incremento differenziato di due variabili in un ciclo for

se io voglio incrementare due variabili allo stesso tempo, applicando 
l'identico incremento per tutte e due, scrivo, ad esempio:
 
for ((a=1, b=1; a <= 6, b <= 10 ; a++, b++)); do echo -n "A$a B$b "; done
 
che darà
 
A1 B1 A2 B2 A3 B3 A4 B4 A5 B5 A6 B6 A7 B7 A8 B8 A9 B9 A10 B10
 
io però vorrei ottenere:
 
A1 B1 A2 B2 A3 B3 A4 B4 A5 B5 A6 B6 B7 B8 B9 B10
 
facendo cioè in modo che la prima variabile si incrementi fino a 6 
(arrestandosi) e la seconda invece continui fino a 10
 
è possibile usando un unico ciclo for?
-- 
Puppy Linux wiki:  
http://dokupuppylinux.tk
 
Puppy Linux Forum: 
http://www.italianpuppy.org/
 
Windows me genuit, Ubuntu rapuere / tenet nunc Puppy Linux...
invito dropbox 2GB free - 
http://db.tt/Vc6IeN4
 

 è possibile usando un unico ciclo for?
usando un unico contatore e mettendo un if
 
for ((x=1; x<=10; x++)); do if [ $((x<=6)) == 1 ]; then echo -n "A$x B$x 
"; else echo -n "B$x "; fi; done; echo
 
che produce 
 
A1 B1 A2 B2 A3 B3 A4 B4 A5 B5 A6 B6 B7 B8 B9 B10 
 
Luca
 

for ((x=1; x<=10; x++)); do if [ $((x<=6)) == 1 ]; then echo -n "A$x B$x 
"; else echo -n "B$x "; fi; done; echo
[...]
un post da incorniciare, grazie per l'aiuto. siccome voglio porre il 
risultato di questo ciclo, come argomento di un altro programma, per 
evitare l'errore di *too many arguments*, dove andrebbe usato xargs? è una 
cosa che mi stavo studiando ma che credo di non aver ancora ben capito
 
alla fine così?
 
for ((x=1; x<=10; x++)); do if [ $((x<=6)) == 1 ]; then echo -n "A$x B$x 
"; else echo -n "B$x "; fi; done; echo |xargs


 "; else echo -n "B$x "; fi; done; echo |xargs
 
for ((x=1; x<=10; x++)); do if [ $((x<=6)) == 1 ]; then echo -n "A$x B$x 
"; else echo -n "B$x "; fi; done | xargs -n 1 echo
 
il "-n 1" dice ad xargs di valutare un argomento per volta (usa gli spazi 
come separatore).
Metti al posto di echo il tuo comando. Attento che il parametro viene 
passato come ultimo argomento al comando echo (altrimenti usa la chiave -
I di xargs)
 
Luca

 A{1..7} B{1..7} B{11..10}
 
  La shell non può espandere {1..$uno}, perché $uno non è un numero.
All'atto della sostituzione a variabile a $uno vi sostituisce un numero,
ma non analizza di nuovo la stringa risultante per vedere se c'è
qualcos'altro che deve fare.  Bisogna allora fare in modo che la
analizzi due volte.  Per questo esiste apposta il comando eval:
 
uno="7"; due="11"; for x in $(eval echo {1..$uno}); do echo -n "A$x B$x
"; done; eval echo -n B{$due..10}
A1 B1 A2 B2 A3 B3 A4 B4 A5 B5 A6 B6 A7 B7 B11 B10
 
  Fare così però è da considerare cattiva programmazione: a for non si
dovrebbe dare una lista di argomenti indicizzati da una variabile, a
meno che non si sia sicuri che il valore massimo di oggetti espansi
resti piccolo (e però così facendo ci si espone maggiormente ad errori).
 È meglio sostituire il ciclo for con un ciclo until o while che generi
a ciascuna interazione il valore su cui lavorare, senza espandere in un
colpo solo tutta la gamma di valori sin dall'inizio.
 
INIZIO=1
FINE=10
PASSO=2
INDICE="$INIZIO"
while test "$INDICE" -le "$FINE"
do echo "Da $INIZIO a $FINE di $PASSO in $PASSO passando per $INDICE"
   INDICE="$((IND+PASSO))"
done
 
 
  Ciao,
 
 
-- 
Alessandro Selli 
http://alessandro.route-add.net
 
AVVERTENZA: i messaggi inviati a "trappola" non mi arriveranno.
WARNING: messages sent to "trappola" will never reach me.

    INDICE="$((IND+PASSO))"
 
  'Azz: INDICE="$((INDICE+PASSO))"
