J'essaie de parcourir deux séquences dans la même boucle dans mon shell comme ci-dessous:
#!/bin/bash
for i in (1..15) and (20..25) ;
do
echo $i
......
.....other process
done
une idée comment je peux y arriver?
command-line
bash
sh
HISI
la source
la source
Réponses:
Vous avez seulement besoin d'une extension de soutien pour cela
Nous pouvons passer une liste à
for
( ).for i in x y z; do stuff "$i"; done
Donc, ici, les accolades
{
}
obtiennent le shell pour développer vos séquences dans une liste. Vous avez seulement besoin de mettre un espace entre eux, car le shell divise les listes d'arguments sur ceux-ci.la source
echo
les chiffrestouch
fichiers, ils peuvent le fairetouch {1..15}.txt {20..25}.txt
, aucune boucle n'est nécessaire ici. Mais bien sûr, si c'est plusieurs actions sur le même numéro - OK, cela pourrait utiliser une boucle.Alternativement, nous pouvons utiliser
seq
( imprimer une séquence de nombres ), voici deux exemples équivalents:S'il s'agit d'un script, pour des tâches répétitives, vous pouvez utiliser des fonctions:
la source
La réponse de Zanna et la réponse de pa4080 sont à la fois bien et je serais probablement aller avec l' un d'eux dans la plupart des cas. Cela va peut-être de soi, mais pour être complet, je le dirai quand même: vous pouvez charger chaque valeur dans un tableau puis boucler sur le tableau. Par exemple:
la source
Boucle sans boucle
La réponse de Zanna est absolument correcte et bien adaptée à bash, mais nous pouvons encore améliorer cela sans utiliser de boucle.
Le comportement de
printf
est tel que si le nombre deARGUMENTS
est supérieur aux contrôles de format'FORMAT STRING'
, alors toutprintf
sera diviséARGUMENTS
en morceaux égaux et continuera de les ajuster à la chaîne de formatage jusqu'à ce qu'il soit épuiséARGUMENTS
.Si nous recherchons la portabilité, nous pouvons utiliser à la
printf "%d\n" $(seq 1 15) $(seq 20 25)
placeAllons plus loin et plus amusant. Disons que nous voulons effectuer une action plutôt que d'imprimer simplement des nombres. Pour créer des fichiers à partir de cette séquence de nombres, nous pourrions facilement le faire
touch {1..15}.txt {20..25}.txt
. Et si nous voulons que plusieurs choses se produisent? Nous pourrions également faire quelque chose comme ceci:Ou si nous voulons le faire à l'ancienne:
Alternative portable mais verbeuse
Si nous voulons créer une solution de script qui fonctionne avec des shells qui n'ont pas d'expansion d'accolade (ce
{1..15} {20..25}
sur quoi repose), nous pouvons écrire une simple boucle while:Bien sûr, cette solution est plus verbeuse, certaines choses pourraient être raccourcies, mais cela fonctionne. Testé avec
ksh
,dash
,mksh
et, bien sûrbash
.Boucle de style Bash C
Mais si nous voulions créer une boucle spécifique à bash (pour une raison quelconque, peut-être pas seulement en imprimant mais aussi en faisant quelque chose avec ces nombres), nous pouvons également le faire (essentiellement une version en boucle C de la solution portable):
Ou dans un format plus lisible:
Comparaison des performances de différentes approches en boucle
Alternative sans coque
Tout simplement parce que nous pouvons voici la solution Python
Ou avec un peu de coquille:
la source
touch $(printf "%d\n" {1..15} {20..25})
:-)bash
vous n'en avez même pas besoin$()
, justetouch {1..15}.txt {20..25}.txt
:) Mais bien sûr, nous pourrions utiliserprintf "%d\n
{1..15} {20..25} `avecxargs
si nous voulions faire plus que de simplestouch
fichiers. Il y a plusieurs façons de faire les choses et cela rend le script tellement amusant!