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 $max
METHODE 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 seq
beschikbaar is op uw systeem:
for i in `seq 2 $max`
do
echo "output: $i"
done
Zo niet, gebruik dan het seq
van 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 ksh
en zsh
, wanneer bash -c
wordt vervangen door ksh -c
of zsh -c
respectievelijk.
Opmerking: for i in {2..${max}}; do echo $i; done
werkt in zsh
en 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 seq
niet op mijn systeem had geïnstalleerd (Mac OS X v10.6.1 (Snow Leopard)), gebruikte ik uiteindelijk een while
loop 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 continue
in 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.