Bash: повторять символ переменное количество раз

По вопросам и размышлениям в:

https://unix.stackexchange.com/questions/188658/writing-a-character-n-times-using-the-printf-command

а также

Как я могу повторить символ в bash?

Я хотел бы узнать, как можно параметризовать повторяющееся значение для символа / строки. Например, следующее прекрасно работает:

printf "   ,\n%0.s" {1..5}

Однако, если бы я хотел параметризовать «5», скажите:

num=5

Кажется, я не могу правильно настроить расширение, чтобы эта работа работала. Например:

printf "   ,\n%0.s" {1..$((num))}

терпит неудачу.

Любые мысли / идеи будут очень приветствоваться - я считаю, что есть способ сделать это, не прибегая к perl или awk, так что просто любопытно, если возможно.

Спасибо!

Выражение последовательности невозможно с переменными.

Cyrus 01.05.2018 16:18

Раскрытие скобок происходит перед расширением параметров в bash, нужно прибегать к eval или циклу в стиле C.

andlrc 01.05.2018 16:18
В чем разница между методом "==" и equals()
В чем разница между методом "==" и equals()
Это один из наиболее часто задаваемых вопросов новичкам на собеседовании. Давайте обсудим его на примере.
Замена символа по определенному индексу в JavaScript
Замена символа по определенному индексу в JavaScript
В JavaScript существует несколько способов заменить символ в строке по определенному индексу.
5
2
4 456
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Можно использовать seq

num=20;
printf '\n%.0s' $(seq $num)

Если прибегнуть к внешней команде, AWK будет более портативным, поскольку seq является частью GNU coreutils.

andlrc 01.05.2018 16:21

Большое вам спасибо за это. В соответствии с другим комментарием я хотел бы придерживаться чего-то максимально переносимого, поэтому я выбрал решение eval, но я ценю это предложение и его обходной путь к опасностям использования eval.

Kid Codester 01.05.2018 16:46
Ответ принят как подходящий

Если вы можете построить команду в виде строки - со всем желаемым расширением параметров - вы можете ее оценить. Это печатает X num раз:

num=10
eval $(echo printf '"X%0.s"' {1..$num})

Пинаю себя за то, что забыл eval. Спасибо!

Kid Codester 01.05.2018 16:47

Немного другой подход

$ repeat() {
    local str=$1 n=$2 spaces
    printf -v spaces "%*s" $n " "     # create a string of spaces $n chars long
    printf "%s" "${spaces// /$str}"   # substitute each space with the requested string
}
$ repeat '!' 10
!!!!!!!!!!                     # <= no newline
$ repeat $'   ,\n' 5
   ,
   ,
   ,
   ,
   ,

Другие вопросы по теме