it-swarm.com.de

Shell-Skript "für" -Schleifensyntax

Ich habe Folgendes zur Arbeit gebracht:

for i in {2..10}
do
    echo "output: $i"
done

Es erzeugt eine Reihe von Zeilen mit output: 2, output: 3 usw.

Versuchen Sie jedoch Folgendes auszuführen:

max=10
for i in {2..$max}
do
    echo "$i"
done

produziert folgendes:

output: {2..10}

Wie kann ich den Compiler dazu bringen, zu erkennen, dass $ max als das andere Ende des Arrays und nicht als Teil eines Strings behandelt werden soll?

178
eykanal

Klammererweiterung, {x..y} wird vor anderen Erweiterungen ausgeführt, daher können Sie diese nicht für Sequenzen variabler Länge verwenden.

Verwenden Sie stattdessen die seq 2 $max -Methode als Benutzer Mob angegeben .

Für Ihr Beispiel wäre es also:

max=10
for i in `seq 2 $max`
do
    echo "$i"
done
219
whatsisname

Probieren Sie die arithmetische Ausdrucksversion von for:

max=10
for (( i=2; i <= $max; ++i ))
do
    echo "$i"
done

Dies ist in den meisten Versionen von bash verfügbar und sollte auch mit Bourne Shell (sh) kompatibel sein.

67
system PAUSE

Schritt die Schleife manuell:

 i = 0 
 max = 10 
, während [$ i -lt $ max] 
 
 "output: $ i" 
 true $ ((i ++)) 
 done 

Wenn Sie nicht unbedingt POSIX sein müssen, können Sie die arithmetische for -Schleife verwenden:

 max = 10 
 für ((i = 0; i <max; i ++)); mache ein Echo von "output: $ i"; getan

Oder verwenden Sie jot (1) auf BSD-Systemen:

 für i in $ (jot 0 10); mache ein Echo von "output: $ i"; getan
27
Nietzche-jou

Wenn der Befehl seq auf Ihrem System verfügbar ist:

for i in `seq 2 $max`
do
  echo "output: $i"
done

Wenn nicht, dann benutze seq des armen Mannes mit Perl:

seq=`Perl -e "\$,=' ';print 2..$max"`
for i in $seq
do
  echo "output: $i"
done

Achte auf diese Anführungszeichen.

9
mob

Es gibt mehr als einen Weg, dies zu tun.

max=10
for i in `eval "echo {2..$max}"`
do
    echo "$i"
done
9
ephemient

Dies ist ein Weg:
Bash:

max=10
for i in $(bash -c "echo {2..${max}}"); do echo $i; done

Der obige Bash-Weg funktioniert auch für ksh und zsh, wenn bash -c durch ksh -c bzw. zsh -c ersetzt wird.

Hinweis: for i in {2..${max}}; do echo $i; done funktioniert in zsh und ksh.

4
Jahid

Wir können die Schleife wie bei der C-Programmierung durchlaufen.

#!/bin/bash
for ((i=1; i<=20; i=i+1))
do 
      echo $i
done
4
rashedcs

Hier funktionierte es unter Mac OS X.

Es enthält das Beispiel eines BSD-Datums sowie Informationen zum Erhöhen und Verringern des Datums:

for ((i=28; i>=6 ; i--));
do
    dat=`date -v-${i}d -j "+%Y%m%d"` 
    echo $dat
done
2
minhas23

Nun, da ich den Befehl seq nicht auf meinem System installiert hatte (Mac OS X 10.6.1 (Snow Leopard)), verwendete ich stattdessen eine while -Schleife:

max=5
i=1

while [ $max -gt $i ]
do
    (stuff)
done

* Achselzucken * Was auch immer funktioniert.

2
eykanal

Diese machen alle {1..8} und sollten alle POSIX sein. Sie werden auch nicht unterbrochen, wenn Sie eine bedingte continue in die Schleife einfügen. Der kanonische Weg:

f=
while [ $((f+=1)) -le 8 ]
do
  echo $f
done

Ein anderer Weg:

g=
while
  g=${g}1
  [ ${#g} -le 8 ]
do
  echo ${#g}
done

und ein anderer:

set --
while
  set $* .
  [ ${#} -le 8 ]
do
  echo ${#}
done
1
user4427511

Verwenden:

max=10
for i in `eval echo {2..$max}`
do
    echo $i
done

Sie benötigen den expliziten 'eval'-Aufruf, um das {} nach der Variablensubstitution neu zu bewerten.

1
Chris Dodd