Portál AbcLinuxu, 10. května 2025 19:34
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.