one make loop how for files bash for-loop

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

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

Changelog

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