6
votes

Pour le contrôle de la boucle dans Bash à l'aide d'une chaîne

Je veux utiliser une chaîne pour contrôler A pour boucle dans Bash. Mon premier code de test produit ce que je voudrais attendre et ce que je veux: XXX PRE>

J'aimerais utiliser quelque chose comme ce qui suit. Cela ne donne pas la sortie que j'aimerais (je peux voir pourquoi cela fait ce qu'il fait). P>

$ aa='1..4'
$ for ii in $aa; do echo $ii; done
1..4


1 commentaires

Pourquoi voulez-vous utiliser une chaîne pour créer une séquence de chiffres? Pouvez-vous donner un exemple où pour ((i = 1; i <5; i ++)); fais …; fait est insuffisant?


4 Réponses :


1
votes

bash ne fera pas Expansion de BRACE avec des variables, mais vous pouvez utiliser EVAL CODE>:

IFS=. arr=($aa) 
for ((ii=arr[0]; ii<arr[2]; ii++)); do echo $ii; done


0 commentaires

2
votes

La notation pourrait être écrite comme suit: xxx

mais le {1..4} doit être écrit comme ça, aucune variables n'est impliquée, et pas à la suite d'une substitution variable. C'est Expansion de Brace dans le manuel Bash, et il arrive avant les expansions des chaînes, etc. Vous serez probablement mieux en utilisant: xxx

où les 1 ou les 4 ou les deux peuvent être des variables de coque. < / p>


2 commentaires

L'utilisation de SEQ me fait interroger l'ensemble string chose, puisqu'un arithmétique pour la boucle est presque certainement mieux.


C'est une autre façon de le faire, @kojiro, à coup sûr. Cela pourrait être mieux. J'ai toujours tendance à utiliser des notations shell qui ne sont pas exclusives à Bash, mais la question est marquée bash afin que vous puissiez fournir cela comme une réponse alternative.



2
votes

Vous pouvez utiliser la commande SEQ (voir homme SEQ ). XXX


1 commentaires

Cela n'accepte pas une chaîne en tant qu'entrée que celle décrite par la question.



0
votes

note forte> Il existe certainement des moyens plus élégants de faire cela, comme la réponse de Ben Grimm, et ce n'est pas pure bash, comme utilise SEQ et AWK.

Un moyen de réaliser cela est en appelant SEQ code>. Il serait trivial si vous connaissez les chiffres dans la corde à l'avance, il n'y aurait donc pas besoin de faire de la conversion, comme vous pouvez le simple faire SEQ 1 4 code> ou SEQ $ A $ B Pour cette affaire. P>

Je suppose, cependant, que votre entrée est en effet une chaîne dans le format que vous avez mentionné, c'est-à-dire 1..4 code> ou ou 20..100 code>. Pour cette fin, vous pouvez convertir la chaîne en 2 numéros les ANS les utilisez comme paramètres pour SEQ code>. P>

Une des façons d'atteindre cet objectif est la suivante: P>

$ x="10..15"
$ `echo $x | tr "." " " | awk '{print "seq", $1, $2}'`
10
11
12
13
14
15


0 commentaires