Чистый способ 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}"
}