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

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

37 голосов
/ 07 декабря 2010

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

FILE_MM_DD.dat

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

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

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

Ответы [ 3 ]

53 голосов
/ 07 декабря 2010

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

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

8 голосов
/ 07 декабря 2010

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

$ printf "FILE_%02d_%02d.dat" 1 2
FILE_01_02.dat
1 голос
/ 14 октября 2015

Попробуйте:

sprintf() { local stdin; read -d '' -u 0 stdin; printf "$@" "$stdin"; }

Пример:

$ echo bar | sprintf "foo %s"
foo bar
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...