Portál AbcLinuxu, 29. listopadu 2025 20:57
První možnost je klasický hnus (vyhodnocování zbytečné podmínky v cyklu):
declare -ri N=10
# ...
for ((i = 0; i < N; ++i)); do
if ((i == 0)); then
. /někde/nějaký/soubor
fi
# ...
echo "Iteration $i"
done
Nebo odděl první iteraci cyklu od zbytku cyklu.
declare -ri N=10
# ...
if ((N)); then
. /někde/nějaký/soubor
echo 'Iteration 0'
for ((i = 1; i < N; ++i)); do
# ...
echo "Iteration $i"
done
fi
Ale bez funkcí tam^^^ prostě bude nějaká duplikace kódu. Pokud se jí chceš vyhnout, asi by bylo lepší použít funkce. Pokud to má být celé hlavolam ze zápočtové úlohy nebo tak něco, kde se za každou cenu nesmí používat funkce, ale cokoliv jiného ano, můžeš (někdy) místo funkcí použít eval a proměnnou (fujBLE!).
declare -ri N=10
declare -r STEP='echo "Iteration $i"'
# ...
if ((N)); then
. /někde/nějaký/soubor
i=0
eval "$STEP"
for ((i = 1; i < N; ++i)); do
# ...
eval "$STEP"
done
fi
Nerozumím. V jakém smyslu to není řešení pro Bash? Neběží to snad v Bashi? Běží. Takže … v čem přesně je chyba?
Běží. Teda aspoň u mne. Vyzkoušeno na verzi 4.3.11 a 4.4.12.
Smyčky jsou zdokumentované (mimo jiné) tady na straně 10. (Taky jsou samozřejmě popsané v manuálové stránce.)
Nemůže to být spouštěním Bashe v nějakém divném restriktivním režimu? Když ale spustím Bash v režimu --posix, všechny smyčky mi pořád normálně fungují. Tak nevím.
~$ declare -ri N=10 ; for ((i = 0; i < N; ++i)); do ; echo $i ; done bash: chyba syntaxe poblíž neočekávaného tokenu „;“Ale nenapadlo mě, že jde o ten středník za do.
#!/bin/bash skript=`cat skript_nejaky.sh` volat=2; while [ "$volat" -gt "0" ]; do eval "$skript" # vykona kod v premenne skript let volat-- done
Používat while cyklus na něco s počítadlem je ošklivé.
volat=2 for ((i = 0; i < volat; ++i)); do eval "$skript" done
for premenna in `vrat_cisla OD DO KROK`; do
...
done
vrat_cisla prikaz z hlavy neviem ako sa vola.
Kompatibilní je třeba tohle (ve smyslu, že Dash to spustí):
for i in $(seq 0 2); do echo "$i"; done
Hezčí verze podobné konstrukce, ale bohužel jenom pro Bash:
for i in {0..2}; do echo "$i"; done
for i in {a..c}; do echo "$i"; done
for i in {0..10..2}; do echo "$i"; done
for i in {a..z..3}; do echo "$i"; done
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.