Bash printf: как понять синтаксис нулевой точки s ("% 0.s") - PullRequest
0 голосов
/ 28 января 2019

Используя Bash printf, я не знаю, как понять синтаксис следующего кода.

echo $(printf "%0.s../"  2  ); 
# ../
echo $(printf "%0.s../"  );   
# ../
echo $(printf "%0.s../" 1 );
# ../

чтение из man printf,

...

s
Байты из строкового аргумента печатаются до достижения конца или до тех пор, пока не будет достигнуто число байтов, указанное в спецификации точности;однако, если точность равна 0 или отсутствует, строка печатается полностью.

...

и я все еще не знаю код выше.

и почему следующий код печатается несколько раз?

# repeating character 
echo $(printf "%0.s../" 1 2  );
# ../../

при просмотре с https://wiki.bash -hackers.org / commands / builtin / printf

...

.Точка: вместе с шириной поля поле не расширяется при увеличении длины текста, вместо этого текст усекается.«% .s» является недокументированным эквивалентом для «% .0s», что приведет к нулевой ширине поля, эффективно скрывая поле от вывода

...

notполучил еще.Мне нужно какое-то объяснение.

Ответы [ 2 ]

0 голосов
/ 28 января 2019

У вас есть классическая проблема наличия меньшего числа спецификаторов формата, чем фактических аргументов для случая

printf "%0.s../" 1 2

Bash применяет правила спецификатора один к одному с аргументами, но в случае неправильного соответствия правила спецификатора в основном копируются, как если бы он выполнялся как

printf "%0.s../../" 1

. Вам необходимо добавить дополнительный спецификатор для 2 как

printf "%0.s..%0.s/" 1 2

, в которомВ случае, если вы просто получаете один ../ вывод при совпадении правил форматирования.

Что касается синтаксиса %0.s, кажется, что он усекает строку аргумента, как вы заметили.Единственная проблема с вашей логикой - неправильные спецификаторы, как описано выше.Поле ширины имеет больше смысла при печати длинных значений в оболочке, в которой точность с определяется полями ширины.Например,

printf '%4.2f\n' 1323.343233
1323.34

, который printf() понимает, поскольку у вас есть число, состоящее из 4 цифр, предшествующих точке, и прецизионных цифр максимум 2.

Вам не нужно echo вывод printf() на первое место.Вы можете использовать спецификатор формата \n в конце для печати новой строки.

printf "%0.s..%0.s/\n" 1 2
0 голосов
/ 28 января 2019

Этот пример может прояснить, как работает поле ширины

printf '%.0s../\n' ABCDEFG
../
printf '%.1s../\n' ABCDEFG
A../
printf '%.2s../\n' ABCDEFG
AB../
printf '%.7s../\n' ABCDEFG
ABCDEFG../

, когда ширина равна 0, тогда поле вообще не печатается.

Затем, если есть больше аргументов, чемполя, printf повторяет формат

printf '%.7s../\n' ABCDEFG abcdefg
ABCDEFG../
abcdefg../
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...