2010-12-07 4 views
32

У меня есть сгенерированный автоматически файл каждый день, который вызывается скриптом оболочки. Но проблема я столкнулся в том, что автоматически сгенерированный файл имеет вид:SPRINTF в сценариях оболочки?

FILE_MM_DD.dat 

... где ММ и ДД являются 2-значный месяц и день-оф-месяц строки.

Я провел некоторое исследование и ударил его самостоятельно, но я не знаю, как создавать эти настраиваемые строки, используя только скрипты оболочки.

Чтобы быть ясно, я отдаю себе отчет в функции DATE в Bash, но то, что я ищу является эквивалентом функции Sprintf в С.

+0

Кроме того, моя спецификация требует, чтобы я генерировать строки, как FILE_12_1.dat вместо FILE_12_01.dat, где требуется. – 2010-12-07 14:46:10

+0

Затем «DD» является ложным. – 2010-12-07 14:49:18

+1

Правильно, DD не является частью моей спецификации, а всего лишь ярлыком для объяснения вещей. Есть идеи? – 2010-12-07 15:25:40

ответ

42

В Bash:

var=$(printf 'FILE=_%s_%s.dat' "$val1" "$val2") 

или, что эквивалентно, а ближе к sprintf:

printf -v var 'FILE=_%s_%s.dat' "$val1" "$val2" 

Если переменные содержат десятичные значения с ведущими нулями, вы можете удалить ведущие нули :

val1=008; val2=02 
var=$(printf 'FILE=_%d_%d.dat' $((10#$val1)) $((10#$val2))) 

или

printf -v var 'FILE=_%d_%d.dat' $((10#$val1)) $((10#$val2)) 

The $((10#$val1)) принуждают значение в основании 10 так %d в спецификации формата не считает, что «08» является недопустимым восьмеричное значение.

Если вы используете date (по крайней мере, для GNU date), вы можете опустить начальные нули, как это:

date '+FILE_%-m_%-d.dat' 

Для полноты картины, если вы хотите добавить ведущих нулей, проложенный к определенная ширина:

val1=8; val2=2 
printf -v var 'FILE=_%04d_%06d.dat' "$val1" "$val2" 

или с динамическими ширин:

val1=8; val2=2 
width1=4; width2=6 
printf -v var 'FILE=_%0*d_%0*d.dat' "$width1" "$val1" "$width2" "$val2" 

Добавление ведущих нулей полезно для создания значений, которые легко сортируются и аккуратно выравниваются в столбцах.

7

Почему бы не использовать программу PRINTF из Coreutils?

$ printf "FILE_%02d_%02d.dat" 1 2 
FILE_01_02.dat 
Смежные вопросы