Заполняющие нули в строке

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

Я попробовал следующее:

n=1

n = printf %03d $n

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

но переменная 'n' не остается постоянной. Как я могу сделать это постоянным?

Ответ 1

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

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

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

n=`printf %03d $n`

и после этого используйте замену переменной $n, которую вы использовали раньше.

Ответ 2

Кажется, вы назначаете возвращаемое значение команды printf (это его код выхода), вы хотите назначить вывод printf.

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

Расстояние между метками и обратными окнами

Ответ 5

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

Намного легче работать, когда вы пытаетесь вложить несколько подстановок команд вместо экранирования, т.е. "обратный слэш", backtics.

Ответ 6

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

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