J'ai besoin de boucler des valeurs,
for i in $(seq $first $last)
do
does something here
done
Pour $first
et $last
, il me faut une longueur fixe de 5. Donc, si vous saisissez 1
, je dois ajouter des zéros devant afin qu’il devienne 00001
. Il boucle jusqu'au 99999
par exemple, mais sa longueur doit être de 5.
Exemple: 00002
, 00042
, 00212
, 012312
et ainsi de suite.
Une idée sur comment je peux faire ça?
Dans votre cas particulier, il est probablement plus simple d'utiliser l'indicateur -f
en seq
pour le mettre en forme afin de formater les nombres au fur et à mesure qu'il affiche la liste. Par exemple:
for i in $(seq -f "%05g" 10 15)
do
echo $i
done
produira la sortie suivante:
00010
00011
00012
00013
00014
00015
Plus généralement, bash
a printf
en tant que fonction intégrée, vous pouvez donc ajouter des zéros à la sortie comme suit:
$ i=99
$ printf "%05d\n" $i
00099
Vous pouvez utiliser l'indicateur -v
pour stocker le résultat dans une autre variable:
$ i=99
$ printf -v j "%05d" $i
$ echo $j
00099
Notez que printf
prend en charge un format légèrement différent de seq
. Vous devez donc utiliser %05d
au lieu de %05g
.
Plus facile encore, vous pouvez juste faire
for i in {00001..99999}; do
echo $i
done
Si la fin de la séquence a une longueur maximale de remplissage (par exemple, si vous voulez 5 chiffres et que la commande est "seq 1 10000"), vous pouvez utiliser l'indicateur "-w" pour seq - il ajoute le remplissage lui-même.
seq -w 1 10
produire
01
02
03
04
05
06
07
08
09
10
utilisez printf avec "% 05d", par exemple.
printf "%05d" 1
Très simple en utilisant printf
[jaypal:~/Temp] printf "%05d\n" 1
00001
[jaypal:~/Temp] printf "%05d\n" 2
00002
Utilisez awk comme ceci:
awk -v start=1 -v end=10 'BEGIN{for (i=start; i<=end; i++) printf("%05d\n", i)}'
SORTIE:
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
Mettre à jour:
En tant qu'alternative pure bash, vous pouvez le faire pour obtenir le même résultat:
for i in {1..10}
do
printf "%05d\n" $i
done
De cette façon, vous pouvez éviter d’utiliser un programme externe seq
qui est NON disponible sur tous les types de * nix.
Je remplis la sortie avec plus de chiffres (zéros) que nécessaire, puis utilise tail pour n'utiliser que le nombre de chiffres que je recherche. Notez que vous devez utiliser '6' dans la queue pour obtenir les cinq derniers chiffres :)
for i in $(seq 1 10)
do
RESULT=$(echo 00000$i | tail -c 6)
echo $RESULT
done
Si vous voulez N chiffres, ajoutez 10 ^ N et supprimez le premier chiffre.
for (( num=100; num<=105; num++ ))
do
echo ${num:1:3}
done
Sortie:
01
02
03
04
05
Cela fonctionnera aussi:
for i in {0..9}{0..9}{0..9}{0..9}
do
echo "$i"
done
Autre moyen:
zeroos="000"
echo
for num in {99..105};do
echo ${zeroos:${#num}:${#zeroos}}${num}
done
Fonction si simple pour convertir n'importe quel nombre serait:
function leading_zero(){
local num=$1
local zeroos=00000
echo ${zeroos:${#num}:${#zeroos}}${num}
}
Si vous êtes juste après avoir rempli des chiffres avec des zéros pour obtenir une longueur fixe, ajoutez simplement le multiple de 10 le plus proche, par exemple. pour 2 chiffres, ajoutez 10 ^ 2, puis supprimez le premier avant d'afficher le résultat.
Cette solution fonctionne pour compacter/formater des nombres simples de n'importe quelle longueur, ou toute une séquence de nombres en utilisant une boucle for.
# Padding 0s zeros:
# Pure bash without externals eg. awk, sed, seq, head, tail etc.
# works with echo, no need for printf
pad=100000 ;# 5 digit fixed
for i in {0..99999}; do ((j=pad+i))
echo ${j#?}
done
Testé sur Mac OSX 10.6.8, Bash ver 3.2.48
1.) Créez une séquence de nombres 'seq' de 1 à 1000 et fixez la largeur '-w' (la largeur est déterminée par la longueur du numéro final, dans ce cas 4 chiffres pour 1000).
2.) Sélectionnez également les numéros souhaités à l'aide de 'sed -n' (dans ce cas, nous sélectionnons des numéros de 1 à 100).
3.) "écho" sur chaque numéro. Les nombres sont stockés dans la variable 'i', accessible à l'aide du '$'.
Avantages: Ce code est assez propre.
Inconvénients: 'seq' n'est pas natif sur tous les systèmes Linux (si j'ai bien compris)
for i in `seq -w 1 1000 | sed -n '1,100p'`;
do
echo $i;
done