Как я могу повторить символ в Bash? - PullRequest
206 голосов
/ 18 марта 2011

Как я могу сделать это с echo?

perl -E 'say "=" x 100'

Ответы [ 26 ]

4 голосов
/ 21 ноября 2013

Я предполагаю, что первоначальная цель вопроса состояла в том, чтобы сделать это только с помощью встроенных команд оболочки.Так что for циклы и printf s будут законными, в то время как rep, perl, а также jot ниже не будутТем не менее, следующая команда, например,

jot -s "/" -b "\\" $((COLUMNS/2))

, печатает строку всего окна \/\/\/\/\/\/\/\/\/\/\/\/

3 голосов
/ 01 июня 2014

Чистый способ Bash без eval, без подоболочек, без внешних инструментов, без расширений скобок (т. Е. У вас может быть число для повторения в переменной):

Если вы получилипеременная n, которая расширяется до (неотрицательного) числа и переменная pattern, например,

$ n=5
$ pattern=hello
$ printf -v output '%*s' "$n"
$ output=${output// /$pattern}
$ echo "$output"
hellohellohellohellohello

. Вы можете создать функцию с помощью:

repeat() {
    # $1=number of patterns to repeat
    # $2=pattern
    # $3=output variable name
    local tmp
    printf -v tmp '%*s' "$1"
    printf -v "$3" '%s' "${tmp// /$2}"
}

С помощьюэтот набор:

$ repeat 5 hello output
$ echo "$output"
hellohellohellohellohello

Для этого небольшого трюка мы довольно часто используем printf с:

  • -v varname: вместо печати на стандартный вывод, printf поместит содержимое отформатированной строки в переменную varname.
  • '% * s': printf будет использовать аргумент для печати соответствующего количества пробелов.Например, printf '%*s' 42 напечатает 42 пробела.
  • Наконец, когда у нас есть требуемое количество пробелов в нашей переменной, мы используем расширение параметра, чтобы заменить все пробелы нашим шаблоном: ${var// /$pattern} расширится дорасширение var с заменой всех пробелов расширением $pattern.

Вы также можете избавиться от переменной tmp в функции repeat, используякосвенное расширение:

repeat() {
    # $1=number of patterns to repeat
    # $2=pattern
    # $3=output variable name
    printf -v "$3" '%*s' "$1"
    printf -v "$3" '%s' "${!3// /$2}"
}
3 голосов
/ 01 марта 2018

Python вездесущ и работает везде одинаково.

python -c "import sys; print('*' * int(sys.argv[1]))" "=" 100

Символ и число передаются как отдельные параметры.

3 голосов
/ 18 марта 2011

В bash 3.0 или выше

for i in {1..100};do echo -n =;done
2 голосов
/ 18 марта 2011
for i in {1..100}
do
  echo -n '='
done
echo
2 голосов
/ 31 октября 2014
repeat() {
    # $1=number of patterns to repeat
    # $2=pattern
    printf -v "TEMP" '%*s' "$1"
    echo ${TEMP// /$2}
}
2 голосов
/ 05 января 2019

Вопрос был о том, как это сделать с echo:

echo -e ''$_{1..100}'\b='

Это будет точно так же, как и perl -E 'say "=" x 100', но только с echo.

1 голос
/ 22 мая 2019

Более элегантная альтернатива предлагаемому решению Python может быть:

python -c 'print "="*(1000)'
1 голос
/ 27 марта 2019

Самое простое - использовать эту строку в bash:

seq 10 | xargs -n 1 | xargs -I {} echo -n  ===\>;echo

1 голос
/ 01 февраля 2019

Как я могу сделать это с эхо?

Вы можете сделать это с помощью echo, если за echo следует sed:

echo | sed -r ':a s/^(.*)$/=\1/; /^={100}$/q; ba'

На самом деле, echo там не нужен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...