Vra

Ek is op soek na die basiese lus soos:

for(int i = 0; i < MAX; i++) {
  doSomething(i);
}

maar vir die bash.

Was dit nuttig?

Oplossing

Van hierdie webwerf :

for i in $(seq 1 10);
do
    echo $i
done

Ander wenke

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

Die bash for bestaan op'n veranderlike (die iterator) en'n lys van woorde waar die iterator sal, wel, itereer.

So, as jy het'n beperkte lys van woorde, net sit hulle in die volgende sintaksis:

for w in word1 word2 word3
do
  doSomething($w)
done

Waarskynlik jy wil om te itereer saam'n paar nommers, sodat jy kan gebruik om die seq die opdrag om te genereer'n lys van die nommers vir jou:(van 1 tot 100 vir voorbeeld)

seq 1 100

en gebruik dit in die lus:

for n in $(seq 1 100)
do
  doSomething($n)
done

Let op die $(...) sintaksis.Dit is'n bash gedrag, dit kan jy om te slaag die uitset van een opdrag (in ons geval van seq) na'n ander (die for)

Dit is regtig nuttig wanneer jy het om te itereer oor al die dopgehou in sommige pad, byvoorbeeld:

for d in $(find $somepath -type d)
do
  doSomething($d)
done

Die moontlikhede is oneindig te genereer lyste.

Bash 3.0 + kan hierdie sintaksis te gebruik:

for i in {1..10} ; do ... ; done

.. wat vermy paai 'n eksterne program om die volgorde (soos seq 1 10) uit te brei.

Natuurlik, het dit dieselfde probleem as die for(()) oplossing, wat gekoppel is aan bash en selfs 'n bepaalde weergawe (as dit vir jou saak maak).

Probeer die bash ingeboude help:


$ help for

for: for NAME [in WORDS ... ;] do COMMANDS; done
    The `for' loop executes a sequence of commands for each member in a
    list of items.  If `in WORDS ...;' is not present, then `in "$@"' is
    assumed.  For each element in WORDS, NAME is set to that element, and
    the COMMANDS are executed.
for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done
    Equivalent to
        (( EXP1 ))
        while (( EXP2 )); do
            COMMANDS
            (( EXP3 ))
        done
    EXP1, EXP2, and EXP3 are arithmetic expressions.  If any expression is
    omitted, it behaves as if it evaluates to 1.


Ek algemeen graag 'n effense variasie gebruik op die standaard vir loop. Ek gebruik dikwels hierdie na 'n opdrag uit te voer op 'n reeks van afgeleë gashere. Ek neem voordeel van stut uitbreiding bash se te skep vir sirkelroetes laat my toe om te skep nie-numeriese vir-sirkelroetes.

Voorbeeld:

Ek wil die uptime opdrag op frontend gashere 1-5 en backend gashere 1-3 loop:

% for host in {frontend{1..5},backend{1..3}}.mycompany.com
    do ssh $host "echo -n $host; uptime"
  done

Ek tipies loop dit as 'n enkel-lyn opdrag met kommapunte op die uithoeke van die lyne in plaas van die meer leesbare weergawe hierbo. Die sleutel gebruik oorweging is dat draadjies kan jy spesifiseer verskeie waardes te plaas in 'n string (bv pre {cat, bar} post resultate in prefoopost, prebarpost) en laat tel / rye deur gebruik te maak van die dubbelperiodes (jy kan 'n gebruik. .z ens). Maar die dubbelperiode sintaksis is 'n nuwe funksie van bash 3.0; vorige weergawes sal ondersteun nie hierdie.

#! /bin/bash

function do_something {
   echo value=${1}
}

MAX=4
for (( i=0; i<MAX; i++ )) ; {
   do_something ${i}
}

Hier is 'n voorbeeld wat ook kan werk in ouer doppe, terwyl hy nog in doeltreffende vir groot tellings:

Z=$(date) awk 'BEGIN { for ( i=0; i<4; i++ ) { print i,"hello",ENVIRON["Z"]; } }'

Maar baie geluk doen nuttige dinge binnekant van awk: Hoe gebruik ek dop veranderlikes in 'n awk script

As jy intereased is net in bash die "vir ((...))" oplossing bo aangebied is die beste, maar as jy wil iets POSIX SH voldoen wat sal werk op alle Unices jy het om te gebruik " Expr "en" terwyl ", en dit is omdat" (()) "of" ev "of" i = i + 1 "is nie so draagbaar tussen verskillende doppe

Ek gebruik variasies van hierdie al die tyd om lêers te verwerk ...

  

vir lêers in * Log; moenie eggo "Doen dinge met: $ lêers"; eggo "Doen meer dinge met: $ lêers"; gedoen;

As die verwerking van lyste van lêers is wat jy geïnteresseerd is, kyk na die -execdir opsie vir .

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top