2012-01-13 7 views
0

J'ai un certain nombre de scripts bash. par exempleexécuter plusieurs scripts

script1_1.sh 
script1_2.sh 
script1_3.sh 

etc ....

Je me demandais, est-il un moyen pour moi de courir ces tous dans un autre script. où par je ne dois pas ajouter manuellement chacun. Donc, à travers l'utilisation d'une boucle for? où il incrémente un nombre comme

for (i=0; i < 40; i++) 
    ./script1_[i].sh 

Je voudrais également vérifier chaque script travaillé, donc sinon, il sortir de la boucle.

if ./script[i] (command unsuccessful) 
then break? 

Quelqu'un peut-il m'aider à écrire ce code? Je suis très nouveau dans les langages de script.

+0

Avez-vous googlé pour bash docs? Nous sommes heureux d'aider à réparer quelque chose qui ne fonctionne pas. Nous ne sommes pas ici pour écrire quelque chose à partir de rien. –

+0

bien j'ai, je ne sais pas juste comment vérifier chaque script a travaillé ou non, et de sortir de la boucle si oui – CodeBlocks

+0

google est votre ami: "bash exit status" -> http://tldp.org/LDP/abs/html /exit-status.html –

Répondre

3

Vous êtes vraiment sur le point de répondre à votre propre question. La boucle de style C fonctionnera correctement pour votre scénario, mais si vos scripts sont nommés de manière aléatoire, vous pouvez utiliser un tableau. Vous pouvez utiliser ||, qui exécutera le côté droit si un état de sortie différent de zéro est renvoyé. Vous pouvez également utiliser une instruction if comme vous l'avez prouvé dans votre question, avec un "!" entre si dans la commande (sinon).

scripts=(script1_1.sh script1_2.sh script1_3.sh) 

for script in "${scripts[@]}"; do 
    ./"$script" || { echo "$script failed"; break; } 
done 

Utilisation de la boucle comme dans vos questions:

for ((i=1;i<4;i++)); do 
    ./script1_${i}.sh || { echo "$script failed"; break; } 
done 
+0

Je viens de l'essayer et c'est parfait! Merci beaucoup pour l'aide, c'est exactement ce que je visais à faire – CodeBlocks

0

Puisque vous avez cette question taggés avec perl, vous pouvez aussi le faire dans un Perl one-liner:

perl -e 'foreach(1..40){system("sh script_" . $_ . ".sh")==0 or die $!;print "script_" . $_ . ".sh done\n";}' 
+0

Vous avez probablement voulu dire «avertir» et non «mourir» – Zaid

+0

@Zaid - Eh bien, l'OP a mentionné qu'il/elle "aimerait aussi vérifier chaque script travaillé, donc sinon, [puis] sortir de la boucle for ", donc pourquoi je l'ai eu" mourir "en cas d'échec. Vous soulevez un bon point, cependant, en ce qu'il n'est pas toujours nécessaire de «mourir». –

Questions connexes