Shell-script “voor” Loop Syntaxis

Ik heb het volgende geworden om te werken:

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

Het produceert een aantal lijnen van output: 2, output: 3, dus op.

Probeert echter het volgende uit:

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

Produceert het volgende:

output: {2..10}

Hoe kan ik de compiler krijgen om te realiseren dat het $ max moet behandelen als het andere uiteinde van de array, en geen deel uitmaken van een string?


Antwoord 1, Autoriteit 100%

Brace-expansie, {x..y} wordt uitgevoerd vóór andere uitbreidingen, dus u kunt dat niet gebruiken voor variabele lengtekeningen.

Gebruik in plaats daarvan de seq 2 $maxMETHODE AS Gebruiker MOB vermeld .

Dus, voor uw voorbeeld zou het zijn:

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

Antwoord 2, Autoriteit 30%

Probeer de rekenkundige expressieversie van for:

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

Dit is verkrijgbaar in de meeste versies van bash, en moet ook Bourne Shell (SH) compatibel zijn.


Antwoord 3, Autoriteit 12%

Stap de lus handmatig:

i = 0
max = 10
terwijl [$ i-lt $ max]
doen
  echo "output: $ i"
  TRUE $ ((I ++))
gedaan

Als u niet volledig MOSIX hoeft te zijn, kunt u de rekenkundige voor lus gebruiken:

max=10
voor (( i=0; i < max; i++ )); doe echo "uitvoer: $i"; gedaan

Of gebruik jot(1) op BSD-systemen:

voor i in $( jot 0 10 ); doe echo "uitvoer: $i"; gedaan

Antwoord 4, autoriteit 4%

Er is meer dan één manier om het te doen.

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

Antwoord 5, autoriteit 4%

Als de opdracht seqbeschikbaar is op uw systeem:

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

Zo niet, gebruik dan het seqvan de arme man met perl:

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

Let op die aanhalingstekens.


Antwoord 6, autoriteit 2%

Dit is een manier:
Bash:

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

De bovenstaande Bash-manier werkt ook voor kshen zsh, wanneer bash -cwordt vervangen door ksh -cof zsh -crespectievelijk.

Opmerking: for i in {2..${max}}; do echo $i; donewerkt in zshen ksh.


Antwoord 7, autoriteit 2%

We kunnen een lus herhalen zoals bij C-programmering.

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

Antwoord 8

Nou, omdat ik de opdracht seqniet op mijn systeem had geïnstalleerd (Mac OS X v10.6.1 (Snow Leopard)), gebruikte ik uiteindelijk een whileloop in plaats daarvan:

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

*Haalt zijn schouders op* Wat werkt.


Antwoord 9

Hier werkte het op Mac OS X.

Het bevat ook het voorbeeld van een BSD-datum, hoe u de datum kunt verhogen en verlagen:

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

Antwoord 10

Deze doen allemaal {1..8}en zouden allemaal POSIX moeten zijn. Ze zullen ook niet breken als je
zet een voorwaardelijke continuein de lus. De canonieke manier:

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

Een andere manier:

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

en nog een:

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

Antwoord 11

Gebruik:

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

Je hebt de expliciete ‘eval’-aanroep nodig om de {} opnieuw te evalueren na vervanging van de variabele.

Other episodes