Подтвердить что ты не робот

SPRINTF в сценариях оболочки?

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

FILE_MM_DD.dat

... где MM и DD - 2-значные месячные и дневные строки.

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

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

4b9b3361

Ответ 1

В 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))

$((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"

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

Ответ 2

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

$ printf "FILE_%02d_%02d.dat" 1 2
FILE_01_02.dat

Ответ 3

Try:

sprintf() { local stdin; read -d '' -u 0 stdin; printf "[email protected]" "$stdin"; }

Пример:

$ echo bar | sprintf "foo %s"
foo bar