В качестве варианта ответа cas введите
printf '0%.s' {1..16}Enter
, а затем с помощью мыши скопируйте и вставьте его (один раз). Возможно, это O (log n), но поскольку это (len (str (n)) + 20), вы можете счесть это неэффективным. Но обратите внимание:
%. S
кажется ведут себя так же, как % .0s
. 0000000000000000
в качестве аргумента, вам нужно сделать это только один раз. Гленн Джекман указывает , что
printf "% 0 * d \ n" число 0
(где число - положительное целое число)
выведет строку из числа нулей (и новой строки),
как звездочка в формате
сообщает printf
, чтобы получить ширину поля из аргументов.
В частности, printf "% 0 * d" 16 0
напечатает 16 нулей.
Но это особый случай, который обрабатывает только 0
.
printf "% 0 * d" 16 12345
напечатает 0000000000012345
,
и printf "% 0 * d" 16 foo
напечатает 0000000000000000
и сообщение об ошибке.
Напротив, другие команды в этом ответе
будут создавать строки вида 123451234512345…
или foofoofoo…
(и см. Ниже для 7% 7% 7% ...
).
Если вы собираетесь делать это часто, вы можете оптимизировать это, определив функцию оболочки:
rep() { printf -- "$1%.0s" $(seq 1 "$2"); printf "\n"; }
Примечания:
$ (seq 1 "$ 2" )
вместо (1 .."$ 2"}
, потому что последний не работает
- см. this , this , this и this .
Обратите внимание, что в некоторых ответах на эти вопросы предлагается использовать eval
,
, но обычно это не рекомендуется. $ 1% .0s
) должна быть заключена в двойные кавычки
(а не в одинарные кавычки), поскольку она содержит параметр ( $ 1
). -
предназначены для защиты от значений $ 1
, начинающихся с -
. «%. 0s $ 1»
вместо «$ 1% .0s»
. $ 1
, содержащее %
, приведет к блокировке. Если вам нужно иметь возможность обрабатывать значения $ 1
, содержащие %
, выполните
rep () {local i; для ((я = 0; я
Кроме того, как только у вас определена такая функция, вы можете делать такие вещи, как
foo --bar=baz "$(rep 0 16)"
, который немного меньше набирает, чем "$ (printf '0% .0s' {1 .. 16}) "
.