2009-07-12 13 views
46

Sto scrivendo uno script bash per ottenere alcuni podcast. Il problema è che alcuni dei numeri di podcast sono di una cifra, mentre altri sono di due/tre cifre, quindi ho bisogno di riempirli per renderli tutti e 3 i numeri.zeri imbottitura in una stringa

ho provato la seguente:

n=1 

n = printf %03d $n 

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

ma la variabile 'n' non rimanere imbottita in modo permanente. Come posso renderlo permanente?

risposta

59

Utilizzare backticks per assegnare il risultato del comando printf (``):

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

EDIT: Si noti che ho rimosso una riga che non era davvero necessario. Se si desidera assegnare l'uscita di 'printf% ...' an, si potrebbe uso

n=`printf %03d $n` 

e dopo che, utilizzare il $ n sostituzione di variabile è stato utilizzato in precedenza.

+3

Perché non: 'wget $ (printf http://aolradio.podcast.aol.com/sn/SN-%03d $ n.mp3, $ n) '. Basta inserire l'intero URL nell'istruzione 'printf'. –

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

spaziatura nota e backticks

28

Sembra che stai assegnando il valore di ritorno del comando printf (che è il suo codice di uscita), si desidera assegnare l'output di printf.

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

+1 per l'utilizzo di $() - è molto più preferibile backticks –

+2

Perché $() da preferire? – bli

+2

@bli Può essere annidato, mentre i backtick non possono (almeno non senza una qualche forma di escape) – Neil

3

Come detto da noselad, prego sostituzione del comando, cioè $ (...), è preferibile in quanto sostituisce backtics, cioè `...`.

molto più facile lavorare con quando si cerca di nido diverse sostituzioni di comando invece di fuggire, vale a dire "backslashing", backtics.

15

Attenzione però se la stringa di ingresso ha uno zero!
printf sarà ancora fare l'imbottitura, ma anche di convertire la stringa di esadecimale formato ottale.

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

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

Una soluzione a questo sembra stampare un float anziché decimale.
Il trucco sta omettendo il decimali con .0f.

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

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

Questo perché printf prende "0n" come ottale. ottale 33 = decimale 27. Non esadecimale. – cde

3

da evitare il cambio di contesto:

a="123" 
b="00000${a}" 
c="${b: -5}" 
Problemi correlati