2009-07-12 3 views
46

Я пишу скрипт bash, чтобы получить некоторые подкасты. Проблема в том, что некоторые номера подкастов являются одними цифрами, а другие - двумя/тремя цифрами, поэтому мне нужно проложить их, чтобы сделать их все 3 цифры.Заполняющие нули в строке

Я попытался следующие:

n=1 

n = printf %03d $n 

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

но переменная «п» не остается проложенный на постоянной основе. Как я могу сделать это постоянным?

ответ

59

Используйте обратные кавычки, чтобы присвоить результат команды PRINTF (``):

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

EDIT: Обратите внимание, что я удалил одну строку, которая не была действительно необходима. Если вы хотите назначить выход «PRINTF% ...» п, можно использовать

n=`printf %03d $n` 

и после этого использовать $ N подстановку переменной вы использовали ранее.

+3

Почему не: 'Wget $ (Printf http://aolradio.podcast.aol.com/sn/SN-%03d $ n.mp3, $ п) '. Просто поместите весь URL в оператор 'printf'. –

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

интервал Примечания и обратные кавычки

28

Кажется, вы присваиваете значение, возвращаемую команды Е (который является его кодом завершения), вы хотите назначить выход Printf.

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

+1 для использования $() - гораздо предпочтительнее обратных ссылок –

+2

Почему $() предпочтительнее? – bli

+2

@bli Он может быть вложенным, в то время как backticks не может (по крайней мере, не без какой-либо формы экранирования) – Neil

3

Как упомянуто noselad, пожалуйста, команду подстановки, т.е. $ (...), является предпочтительным, поскольку он заменяет backtics, т.е. `...`.

Гораздо проще работать при попытке вложить несколько подстановок команд вместо экранирования, то есть «обратного слэш», backtics.

15

Внимание, хотя ваша входная строка имеет ноль!
printf по-прежнему будет выполнять прописку, но также преобразует вашу строку в hex восьмеричный формат.

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

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

Решение, похоже, печатает поплавок вместо десятичного.
Трюк пропускает десятичные знаки с .0f.

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

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

Это потому, что printf принимает «0n» как восьмеричный. восьмеричный 33 = десятичный 27. Не шестнадцатеричный. – cde

3

избежать переключений контекста:

a="123" 
b="00000${a}" 
c="${b: -5}" 
Смежные вопросы