bash linux repeat: printf

Sep 30, 2013 21:54

Команда printf довольно мощная, часто позволяет обойтись без циклов:

function f { printf "%.0s$1$2" $(seq 10); printf "%.0s$1" ; }
printf "$(f "$(f + ----)\n" "$(f '|' " %%%%2s ")\n")" $(seq 0 99)

Вывод:( Read more... )

shell

Leave a comment

Comments 6

esyr October 1 2013, 01:05:02 UTC
С %.0s (точнее, с %.0d), кстати, в своё время наелся в Linux - его реализация форматтера в этом месте не соответствует POSIX. Надо багу засабмитить, штоле, гм.

Reply

_winnie October 1 2013, 20:39:40 UTC
c 0 всё время везде проблема.

Сначала авторы считают "ну здесь никому не придёт использовать 0". Или "пусть 0 в конфиге - это бесконечность"

Потом используют $N вместо константы, потом в $N приходит 0.

А что не соответствовало? И во FreeBSD, и в Ubuntu печается "12" на printf "%.0d" 12

Reply

esyr October 1 2013, 22:12:06 UTC
0 должен печататься как пустая строка. Я даже в man 3 printf находил:

d, i The int argument is converted to signed decimal notation. The precision, if any, gives
the minimum number of digits that must appear; if the converted value requires fewer
digits, it is padded on the left with zeros. The default precision is 1. When 0 is
printed with an explicit precision 0, the output is empty.

А хуйц, в glibc работает, а в Linux - нет.

Reply

esyr October 1 2013, 22:12:59 UTC
Собственно, хотелось избежать ветвления вокруг printk, запихав всё в аргументы, но нет.

Reply


gegmopo4 October 1 2013, 07:17:02 UTC
«при попытке использовать неканоничные редкие фичи - коллеги перестают понимать твой код,»

Вот теперь я понимаю коллег.

Reply

_winnie October 1 2013, 17:14:34 UTC
Я так на работе не пишу :)

В питоне единственный необычный (необычный для питона, но обычный в JavaScript) прием - это замена

a = 10
do_something(a)

на

(lambda a: do_something(a))(10).

В bash - таки использую printf для повторения файла в шаблоне, и рассказываю об этом для коллег, как это здорово.
printf " --file " *.dat

Reply


Leave a comment

Up