219 votes

Comment ajouter des zéros en tête pour la boucle for dans le shell ?

J'ai une boucle for de base qui incrémente la variable num par 1 à chaque itération...

for (( num=1; num<=5; num++ ))
do
 echo $num
done

Quelles sorties :

1
2
3
4
5

J'essaie de lui faire produire le résultat (ajouter un zéro avant $num) :

01
02
03
04
05

Sans le faire :

echo 0$num

382voto

Adrian Frühwirth Points 8883

Utilisez la syntaxe suivante :

$ for i in {01..05}; do echo "$i"; done
01
02
03
04
05

Avertissement : les zéros non significatifs ne fonctionnent que dans le format >=bash-4 .

Si vous voulez utiliser printf rien ne vous empêche de mettre son résultat dans une variable pour une utilisation ultérieure :

$ foo=$(printf "%02d" 5)
$ echo "${foo}"
05

78voto

piojo Points 141

seq -w détectera la largeur maximale de l'entrée et normalisera la largeur de la sortie.

for num in $(seq -w 01 05); do
    ...
done

Au moment de la rédaction de ce document, cela ne fonctionnait pas sur les dernières versions d'OSX, vous pouvez donc soit installer macports et utiliser sa version de seq ou vous pouvez définir le format explicitement :

seq -f '%02g' 1 3
    01
    02
    03

Mais étant donné la laideur des spécifications de format pour un problème aussi simple, je préfère la solution donnée par Henk et Adrian, qui utilise simplement Bash. Apple ne peut pas se planter puisqu'il n'existe pas de version générique "unix" de Bash :

echo {01..05}

Ou :

for number in {01..05}; do ...; done

53voto

anubhava Points 172509

Utilice printf pour avoir 0 rembourrage :

printf "%02d\n" $num

Votre boucle for sera comme ceci :

for (( num=1; num<=5; num++ )); do printf "%02d\n" $num; done
01
02
03
04
05

31voto

David W. Points 49436

Je ne suis pas intéressé par l'affichage à l'écran (c'est à cela que sert principalement printf, n'est-ce pas ?) La variable $num va être utilisée comme paramètre pour un autre programme mais voyons ce que je peux faire avec ceci.

Vous pouvez toujours utiliser printf :

for num in {1..5}
do
   value=$(printf "%02d" $num)
   ... Use $value for your purposes
done

13voto

Henk Langeveld Points 2959

À partir de bash 4.0, vous pouvez utiliser Extension de l'accolade avec des chaînes de longueur fixe. Voir ci-dessous pour l'annonce originale.

Il fera exactement ce dont vous avez besoin, et ne nécessite rien d'externe au shell.

$ echo {01..05}
01 02 03 04 05

for num in {01..05}
do
  echo $num
done
01
02
03
04
05

CHANGEMENTS, version bash-4.0, section 3

Il s'agit d'une description laconique des nouvelles fonctionnalités ajoutées à bash-4.0 depuis depuis la sortie de bash-3.2.

. . .

z. L'expansion des accolades autorise désormais le remplissage par des zéros des valeurs numériques étendues et ajoutera le nombre approprié de zéros pour s'assurer que toutes les valeurs contiennent le même nombre de chiffres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X