Newsgroup: it.comp.os.linux.sys
Titolo: bash: seq replacement

ho visto che è possibile sostituire, per esempio, la notazione:
seq 2 7
con:
{2..7}
ad esempio: for i in {2..7}; do blablablabla; done
Fin qui funziona. Se però sostituisco uno dei numeri con una variabile
non funziona più.
Mi spiego.
$ export a=7
Questo funziona tranquillamente: seq 2 $a
Questo NON funziona: {2..$a}
Non funziona nemmeno così: {2..${a}}
Nemmeno così: {2.."${a}"}
E nemmeno così: {2.."$a"}
Am I taking Fisks for Fiasks? Ci sarà un modo per farlo funzionare?
-- 
Wikipedia Admin: "wikipedia non è un blog"
Iosif Stalin: "i compagni hanno scambiato il partito per un circolo di
discussione"

 Questo NON funziona: {2..$a}
Potresti usare:
1. eval:
% a=7
% eval  printf '%s\\n' {1..$a}
1
2
3
4
5
6
7
2. Un'altra sintassi:
% for ((i=0;++i<=$a;)); do printf '%s\n' $i; done
1
2
3
4
5
6
7
Dimitre

 % for ((i=0;++i<=$a;)); do printf '%s\n' $i; done
  Questo dovrebbe essere for ((i=0;i<=$a;i++)).
  Comunque, questa sintasssi è di gran lunga preferibile tanto a {...}
quanto a seq.
  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.

 quanto a seq.
[...]
Se proprio devo esprimere un'opinione,
suggerirei una sintassi standard:
i=1 m=7
while [ "$i" -le "$m" ]; do
   printf '%s\n' "$i"
   i="$((i + 1))"
done
Dimitre

done
Ma Max voleva {2..$a}, pero' parlava anche del comando seq.
Con seq il $a lo prende, con le graffe invece non e' mai
possible, credo per il motivo che le graffe son le prime ad
esser espanse, cioe' qcs come: {2..$a}  ->  2..$a  ->  2..10,
invece col comando seq lo prende infatti tranquillo.
Insomma questa che controindicazione ha?
a=10; for j in $(seq 2 $a); do blablabla; done
-- 
Saluti, Dalet

 a=10; for j in $(seq 2 $a); do blablabla; done
L'utilizzo di un comando esterno (seq), e quindi una coppia di fork/exec 
inutili.
Dimitre

Il giorno Sun, 27 Feb 2011 20:06:29 +0000 (UTC)
Dalet <da...@address.invalid> ha scritto:

Niente di personale contro al povero seq. Il "problema", se vogliamo, è
che trattasi di un programma esterno, e magari ti trovi (poniamo caso)
su un hp-ux dove hai bash 4.0 ma non hai seq.... eccetera eccetera...


 fork/exec inutili.
eh si: c'è pure il fork.


 done
  Il pregio dei classici: la portabilità!  :-)
  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.
Chiave PGP/GPG: EC885A8B

 a=10; for j in $(seq 2 $a); do blablabla; done
  Ha la controindicazione che se in a dovesse finire un numero un po' troppo
elevato (dell'ordine di 2^32), for si ritroverebbe una riga di comando di
dimensioni alquanto eccessive, e la shell potrebbe essere trombata dal
sistema operativo per insufficiente disponibilità di memoria, almeno su
sistemi ridotti (embedded, soprattutto).  In ogni caso le prestazioni
saranno molto meno che ottimali.
  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.
Chiave PGP/GPG: EC885A8B

 -bash: ((: ++i<=: syntax error: operand expected (error token is "<=")
Potresti gentilmente indicarmi qual è la versione di bash
che supporta la sintassi:
((i=0;i<=n;i++))
e non supporta:
((i=0;++i<=n;))
Mi basterebbe:
echo $BASH_VERSION
Grazie
Dimitre

 ((i=0;++i<=n;))
Quella in cui la variabile '$n' non è stata preimpostata.


Appunto ...
Dimitre



4.1.7(1)-release
  Inoltre dalla pagina man bash(1) risultano per il ciclo for validi questi
due soli costrutti:
       for name [ [ in [ word ... ] ] ; ] do list ; done
              The list of words following in is expanded, generating a
              list of items. The variable name is set to each element
              of this list in turn, and list is executed each time.  If
              the in word is omitted, the for command executes list
              once for each positional parameter that is set (see
              PARAMETERS below). The return status is the exit status of
              the last command that executes.  If the expansion of the
              items following in results in an empty list, no commands
              are executed, and the return status is 0.
       for (( expr1 ; expr2 ; expr3 )) ; do list ; done
              First, the arithmetic expression expr1 is evaluated
              according to the rules described below under ARITHMETIC
              EVALUATION.  The arithmetic expression expr2 is then
              evaluated repeatedly until it evaluates to zero. Each time
              expr2 evaluates to a non-zero value, list is executed and
              the arithmetic expression expr3 is evaluated. If any
              expression is omitted, it behaves as if it evaluates to 1.
              The return value is the exit status of the last command in
              list that is executed, or false if any of the expressions
              is invalid.
  La sintassi ((i=0;++i<=n;)) non è contemplata e non può quindi essere
considerata valida per questa versione della bash.  Mi dici, piuttosto,
quale versione della bash riconosce la sintassi ((i=0;++i<=n;)) come valida?


Alessandro Selli ha scritto:

  Meglio: lo sarebbe nel caso la terza espressione sia considerata omessa (e
quindi avrebbe assegnato automaticamente il valore 1) e la seconda
espressione, ++i<=n, fosse valida.  Ma non trovo sezioni nella pagina man
che la descrivano.  L'elemento di sintassi ++ compare solamente nella
sezione ARITHMETIC EVALUATION, dove è scritto:
       id++ id--
              variable post-increment and post-decrement
       ++id --id
              variable pre-increment and pre-decrement
  La forma ++id<=var (o simili) non compare nella pagina man (neanche tra i
"comparison operator" della stessa sezione).


Radoulov, Dimitre ha scritto:

  Appunto! :-)



Questo è software libero; è possibile modificarlo e ridistribuirlo.
Non c'è ALCUNA GARANZIA, nei limiti permessi dalla legge.
whip@newflame:~$ for ((i=0;++i<=10;)); do echo $i; done
1
2
3
4
5
6
7
8
9
10

 Bah, a me funziona perfe[cut]
Ok, non avevo capito un cazzo. :)

 "comparison operator" della stessa sezione).
[...]
?
Perchè non deve essere corretta?
% i=1 n=5; (( ++i <= n )) && echo OK; echo $i $n
OK
2 5
ARITHMETIC EVALUATION
[...]
 <= >= < >
 ^^           comparison
Dimitre


Secondo me, avevi capito bene ...
Dimitre

 Perchč non deve essere corretta?
  Lo č, lo č.  Avevo copincollato il codice for ((i=0;++i<=$a;)); do printf
'%s\n' $i; done senza definire la variabile a, da cui l'errore che ricevevo
(e che forse ha ricevuto anche whiplash), e non avevo tenuto conto del fatto
che le espressioni mancanti del ciclo for ((...)) sono automaticamente poste
a 1.  In ultimo, non avevo tenuto conto che in certe situazioni la bash
permette di non separare gli operatori tra di loro, come l'operatore di
preincremento ++ e l'operatore di confronto algebrico <= nella definzione
del ciclo for ((...)).
