2010-10-13 6 views
1

J'ai un programme, ./a que je cours dans une boucle dans le shell.Shell Linux passant des valeurs variables au programme principal

for((i=1 ; i<=30; i++)); do 
./a arg1 5+i &//arg2 that I need to pass in which is the addition with the loop variables 
done 

Comment est-ce que j'ai pu passer dans l'argument arg2 qui est l'addition avec des variables de boucle?

Aussi, j'ai un autre programme qui est ./b que j'ai besoin de courir une fois et qui prend tous les arguments 5 + i. Comment pourrais-je faire cela sans le coder en dur.

./b arg1 6\ 
     7\ 
     8\ 
     9\..... 

Merci.

Répondre

2

L'addition est réalisée avec le même (()) que vous utilisez déjà, alors que concaténation se fait simplement avec "":

for((i=1 ; i<=30; i++)); do 
let j=$((5+i)) 
list="$list $j" 
./a arg1 $j 
done 

./b $list 
+0

+1 Ceci est la bonne réponse. Syntaxe alternative: '((j = 5 + i))' –

1

Cela devrait fonctionner:

(for((i=5 ; i<=30; i++)); do ./a $((5+i)); echo $((5+i)); done) | xargs ./b 
0

Pour votre deuxième partie Je le ferais comme ça

./b arg1 $(seq 6 35) 

Ou si vous avez vraiment besoin l'ajout dans une boucle

declare -a list 
for n in $(seq 1 30) ; do 
    list=("${list[@]}" $((5+n))) 
done 
./b arg1 ${list[@]} 
1

Dans les versions de bash actuelles, vous pouvez utiliser la notation de plage {a..b}. Par exemple.

for i in {1..30}; do 
    ./a arg1 $i 
done 

./b arg1 {6..35} 
Questions connexes