2011-01-13 12 views
3
$ cat fromhere.sh 
#!/bin/bash 

FROMHERE=10 

for i in $(seq $FROMHERE 1) 
do 
echo $i 
done 
$ sh fromhere.sh 
$ 

Warum funktioniert es nicht?
Ich kann keine Beispiele finden, die google nach einer absteigenden Schleife suchen ..., nicht einmal darin variabel. Warum?
absteigende Schleife mit variabler Bash

Antwort

13

Sie sollten die Schrittweite mit f angeben:

seq $FROMHERE -1 1 
1

Sie könnten Bash bevorzugen builtin Shell Arithmetik statt Laichen externen seq:

i=10 
while ((i >= 1)); do 
    echo $((i--)) 
done 
+0

Er verwenden können {} 10..1 zu – marco

+1

@marco: Aber in Bash, können Sie keine Variablen innerhalb Klammer Bereich Ausdrücke verwenden. –

+0

Tut mir leid, es scheint, ich habe nicht sorgfältig gelesen, was das OP fragte :) – marco

6

Bash hat eine for Schleife Syntax für diesen Zweck. Es ist nicht notwendig, das externe seq Dienstprogramm zu verwenden.

#!/bin/bash 

FROMHERE=10 

for ((i=FROMHERE; i>=1; i--)) 
do 
    echo $i 
done 
1

Schlaufe mit for (stop play)

for ((q=500;q>0;q--));do echo $q ---\>\ `date +%H:%M:%S`;sleep 1;done && pkill mplayer 
500 ---> 18:04:02 
499 ---> 18:04:03 
498 ---> 18:04:04 
497 ---> 18:04:05 
496 ---> 18:04:06 
495 ---> 18:04:07 
... 
... 
... 
5 ---> 18:12:20 
4 ---> 18:12:21 
3 ---> 18:12:22 
2 ---> 18:12:23 
1 ---> 18:12:24 

Muster:

for ((...)); do ... ; done 

Beispiel

for ((i=10;i>=0;i--)); do echo $i ; done 

Ergebnis

10 
9 
8 
7 
6 
5 
4 
3 
2 
1 
0 

mit während: ersten Schritt

AAA=10 

dann

while ((AAA>=0));do echo $((AAA--));sleep 1;done 

oder: "AAA--" in während

while (($((AAA-- >= 0))));do echo $AAA;sleep 1;done 

"sleep 1" brauchen nicht