Sto cercando il ciclo di base come:
for(int i = 0; i < MAX; i++) {
doSomething(i);
}
ma per bash.
Sto cercando il ciclo di base come:
for(int i = 0; i < MAX; i++) {
doSomething(i);
}
ma per bash.
Risposte:
Da questo sito :
for i in $(seq 1 10);
do
echo $i
done
for ((i = 0 ; i < max ; i++ )); do echo "$i"; done
ArrayLength=${#array[@]}la usiamo qui invece di max?
La bash forconsiste in una variabile (l'iteratore) e un elenco di parole in cui l'iteratore, beh, itererà.
Quindi, se hai un elenco limitato di parole, inseriscile nella seguente sintassi:
for w in word1 word2 word3
do
doSomething($w)
done
Probabilmente vuoi iterare su alcuni numeri, quindi puoi usare il seqcomando per generare un elenco di numeri per te: (da 1 a 100 per esempio)
seq 1 100
e usalo nel ciclo FOR:
for n in $(seq 1 100)
do
doSomething($n)
done
Nota la $(...)sintassi. È un comportamento bash, ti consente di passare l'output da un comando (nel nostro caso da seq) a un altro (il for)
Questo è davvero utile quando devi iterare su tutte le directory in un percorso, ad esempio:
for d in $(find $somepath -type d)
do
doSomething($d)
done
Le possibilità sono infinite per generare le liste.
Bash 3.0+ può utilizzare questa sintassi:
for i in {1..10} ; do ... ; done
..che evita di generare un programma esterno per espandere la sequenza (come seq 1 10).
Ovviamente, questo ha lo stesso problema della for(())soluzione, essendo legato a bash e persino a una versione particolare (se questo ti interessa).
Prova la guida bashintegrata:
$ 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.
#! /bin/bash
function do_something {
echo value=${1}
}
MAX=4
for (( i=0; i<MAX; i++ )) ; {
do_something ${i}
}
Ecco un esempio che può funzionare anche in shell più vecchie, pur essendo efficiente per grandi numeri:
Z=$(date) awk 'BEGIN { for ( i=0; i<4; i++ ) { print i,"hello",ENVIRON["Z"]; } }'
Ma buona fortuna nel fare cose utili all'interno di awk: Come si usano le variabili di shell in uno script awk?
do/ done.
Di solito mi piace usare una leggera variante del ciclo for standard. Lo uso spesso per eseguire un comando su una serie di host remoti. Approfitto dell'espansione delle parentesi graffe di bash per creare cicli for che mi consentono di creare cicli for non numerici.
Esempio:
Voglio eseguire il comando uptime sugli host frontend 1-5 e backend host 1-3:
% for host in {frontend{1..5},backend{1..3}}.mycompany.com
do ssh $host "echo -n $host; uptime"
done
Di solito lo eseguo come un comando a riga singola con punto e virgola alle estremità delle righe invece della versione più leggibile sopra. La considerazione chiave sull'utilizzo è che le parentesi graffe consentono di specificare più valori da inserire in una stringa (ad es. Pre {foo, bar} post risultati in prefoopost, prebarpost) e consentono il conteggio / sequenze utilizzando i doppi punti (è possibile utilizzare a. .z ecc.). Tuttavia, la sintassi del doppio periodo è una nuova funzionalità di bash 3.0; le versioni precedenti non lo supporteranno.
se sei interessato solo a bash la soluzione "for ((...))" presentata sopra è la migliore, ma se vuoi qualcosa di conforme a POSIX SH che funzioni su tutti gli Unix dovrai usare "expr" e "while", e questo perché "(())" o "seq" o "i = i + 1" non sono così portabili tra le varie shell
Uso sempre variazioni di questo per elaborare i file ...
per i file in * .log; do echo "Fai cose con: $ files"; echo "Fai più cose con: $ files"; fatto;
Se l'elaborazione di elenchi di file è ciò che ti interessa, controlla l' opzione -execdir per i file .