bash - make - ¿Cómo agregar ceros a la izquierda para for-loop en shell?
how to make a for loop in bash (7)
No estoy interesado en enviarlo a la pantalla (para eso se usa principalmente printf, ¿no?) La variable $ num se usará como parámetro para otro programa, pero déjame ver qué puedo hacer con esto.
Aún puedes usar printf
:
for num in {1..5}
do
value=$(printf "%02d" $num)
... Use $value for your purposes
done
Esta pregunta ya tiene una respuesta aquí:
Tengo un número básico para el ciclo que incrementa la variable num por 1 en cada iteración ...
for (( num=1; num<=5; num++ ))
do
echo $num
done
Qué salidas:
1
2
3
4
5
Estoy tratando de hacer que produzca la salida (agregue cero principal antes de $ num):
01
02
03
04
05
Sin hacer:
echo 0$num
¿por qué no printf ''%02d'' $num
? Ver help printf
para este comando interno bash.
Desde bash 4.0 en adelante, puede usar Brace Expansion con cadenas de longitud fija. Vea a continuación el anuncio original.
Hará justo lo que necesita, y no requiere nada externo al caparazón.
$ echo {01..05}
01 02 03 04 05
for num in {01..05}
do
echo $num
done
01
02
03
04
05
Esta es una breve descripción de las nuevas características agregadas a bash-4.0 desde el lanzamiento de bash-3.2.
. . .
z La expansión de llaves ahora permite el relleno cero de valores numéricos expandidos y agregará el número adecuado de ceros para asegurarse de que todos los valores contengan la misma cantidad de dígitos.
Solo una nota: he experimentado diferentes comportamientos en diferentes versiones de bash:
- versión 3.1.17 (1) -release- (x86_64-suse-linux) y
- Versión 4.1.17 (9) -release (x86_64-unknown-cygwin))
para el primero (3.1) for nn in (00..99) ; do ...
for nn in (00..99) ; do ...
funciona pero for nn in (000..999) ; do ...
for nn in (000..999) ; do ...
does not trabajo ambos funcionarán en la versión 4.1; no he probado el comportamiento de printf ( bash --version
dio la información de la versión)
Saludos, Jan
Use el comando printf
para tener 0
relleno:
printf "%02d/n" $num
Su bucle for será así:
for (( num=1; num<=5; num++ )); do printf "%02d/n" $num; done
01
02
03
04
05
Use la siguiente sintaxis:
$ for i in {01..05}; do echo "$i"; done
01
02
03
04
05
Si desea utilizar printf
, nada le impide poner su resultado en una variable para su uso posterior:
$ foo=$(printf "%02d" 5)
$ echo "${foo}"
05
Descargo de responsabilidad: Esto solo funciona en >=bash-4
.
seq -w
detectará el ancho y lo normalizará.
for num in $(seq -w 01 05); do
...
done
Aparentemente, esto no funciona en las versiones más nuevas de iOS, por lo que puedes instalar macports y usar su versión de seq
, o puedes establecer el formato explícitamente:
seq -f ''%02g'' 1 3
01
02
03
Pero dada la fealdad de las especificaciones de formato para un problema tan simple, prefiero la solución que dieron Henk y Adrian, que solo usa Bash. Apple no puede arruinar esto ya que no hay una versión genérica de "unix" de Bash:
echo {01..05}
O:
for number in {01..05}; do ...; done