2009-07-12 14 views
46

Estoy escribiendo una secuencia de comandos bash para obtener algunos podcasts. El problema es que algunos de los números de podcast son de un dígito, mientras que otros tienen dos/tres dígitos, por lo tanto, necesito rellenarlos para convertirlos en los 3 dígitos.Relleno de ceros en una cadena

He intentado lo siguiente:

n=1 

n = printf %03d $n 

wget http://aolradio.podcast.aol.com/sn/SN-$n.mp3 

pero la variable 'n' no se queda permanentemente acolchada. ¿Cómo puedo hacer que sea permanente?

Respuesta

59

Use acentos abiertos para asignar el resultado del comando printf (``):

n=1 
wget http://aolradio.podcast.aol.com/sn/SN-`printf %03d $n`.mp3 

EDIT: Tenga en cuenta que quité una línea que no era realmente necesario. Si desea asignar la salida de 'printf% ...' an, que podría uso

n=`printf %03d $n` 

y después de eso, utilizar la sustitución de variables $ n que ha utilizado anteriormente.

+3

Por qué no: 'wget $ (printf http://aolradio.podcast.aol.com/sn/SN-%03d $ n.mp3, $ n) '. Simplemente ponga toda la URL en la declaración 'printf'. –

4
n=`printf '%03d' "2"` 

Nota espaciamiento y acentos abiertos

28

Parece que está asignando el valor de retorno del comando printf (que es su código de salida), que desea asignar la salida de printf.

bash-3.2$ n=1 
bash-3.2$ n=$(printf %03d $n) 
bash-3.2$ echo $n 
001 
+8

+1 por usar $() - es mucho más preferible a los respaldos –

+2

¿Por qué es preferible $()? – bli

+2

@bli Puede anidarse, mientras que los backticks no pueden (al menos no sin alguna forma de escape) – Neil

3

Según lo mencionado por noselad, por favor comando de sustitución, es decir, $ (...), es preferible, ya que sustituye a backtics, es decir `...`.

Mucho más fácil de trabajar cuando intenta anidar varias sustituciones de comando en lugar de escapar, es decir, "backslashing", backtics.

15

¡Atención si su cadena de entrada tiene un cero inicial!
printf seguirá haciendo el relleno, pero también convertirá su cadena a hex formato octal.

# looks ok 
$ echo `printf "%05d" 03` 
00003 

# but not for numbers over 8 
$ echo `printf "%05d" 033` 
00027 

Una solución para esto parece ser la impresión de un flotador en lugar de decimal. El truco es omitir los lugares decimales con .0f.

# works with leading zero 
$ echo `printf "%05.0f" 033` 
00033 

# as well as without 
$ echo `printf "%05.0f" 33` 
00033 
+1

Eso es porque printf toma "0n" como octal. octal 33 = decimal 27. No hexadecimal. – cde

3

para evitar el cambio de contexto:

a="123" 
b="00000${a}" 
c="${b: -5}" 
Cuestiones relacionadas