2010-08-06 8 views
4

Je n'ai jamais fait de script shell avant et maintenant je suis confronté à un problème simple ... J'ai une boucle for qui s'exécute chaque fois que le script run.sh. Pour voir jusqu'où le script a déjà été exécuté, je veux imprimer par ex. tous les 5000 l'indice réel.pour la boucle/si la condition dans le script shell

$counter = 0 
for (( i = 0 ; i <= 5000; i++ ))do 
    if ($i = $counter); then 
      echo "$counter" 
      counter=$(counter+1000) 
    fi 
./run.sh 
done 

l'exécution de ce morceau de code me donne l'erreur suivante

./for_loop.sh: line 1: =: command not found 
./for_loop.sh: line 3: 0: command not found 

J'ai aussi essayé d'initialiser le compteur variable

declare -i counter = 0 

qui me donne l'erreur suivante

./for_loop.sh: line 1: declare: `=': not a valid identifier 
+0

Alors, comment pouvons-nous aider? – Kami

+1

Dans Bash, il y a deux opérateurs d'affectation, '=' et 'let =', donc vous pouvez assigner le premier compteur avec 'counter = 0' ou' let counter = 0'. 'let' est destiné à être utilisé uniquement avec des nombres alors que' = 'fonctionne avec n'importe quelle chaîne. –

Répondre

6

Vous ne avez pas vraiment besoin de deux compteurs. Un guichet unique suffit:

for ((counter = 0; counter <= 5000; counter++)) 
do 
    if ((counter % 1000 == 0)) 
    then 
      echo "$((counter/1000))" 
    fi 
    ./run.sh 
done 

Ce run.sh 5000 fois exécute et imprime la valeur du compteur 1000 itérations. Notez que % est l'opérateur de module qui calcule le reste après la division et / est l'opérateur de division entier.

+0

merci pour votre belle solution! la commande echo "% ((counter/1000))" imprime en fait% ((compteur/1000)) et non le résultat du compteur/1000. Savez-vous où est le problème? – mkn

+0

Oups! '% ((compteur/1000))' devrait lire '$ ((compteur/1000))'. Remplacez le '%' par un '$'. J'ai corrigé ma réponse. –

+0

oh bien sûr ... aurait pu le découvrir par moi-même :) thx à nouveau – mkn

3

Ligne 1 doit être: (No $, pas d'espace supplémentaire autour '=')

counter=0 

ligne 3 devrait: (crochets, 'eq' parce que '=' est pour l'égalité de chaîne)

if [ $i -eq $counter ] 

ligne 5 doit être: (entre parenthèses) Double

counter=$((counter+1000)) 
+2

Dans la boucle for, il devrait également y avoir un point-virgule entre '))' et 'do', ou' do' devrait être sur le prochain ligne. –

+0

Vous avez raison, mais pour une raison quelconque, 'for ((..)) do' fonctionne correctement sur ma machine (bash 3.2.17). – schot

+0

Qu'en est-il de 'for ((..)) do', c'est-à-dire avec un espace entre la dernière parenthèse fermante et' do'? Peut-être que Bash accepte la parenthèse de fermeture comme un remplacement de délimiteur pour le ';'. –

Questions connexes