По вопросам и размышлениям в:
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, так что просто любопытно, если возможно.
Спасибо!
Раскрытие скобок происходит перед расширением параметров в bash, нужно прибегать к eval
или циклу в стиле C.
Можно использовать seq
num=20;
printf '\n%.0s' $(seq $num)
Если прибегнуть к внешней команде, AWK будет более портативным, поскольку seq
является частью GNU coreutils.
Большое вам спасибо за это. В соответствии с другим комментарием я хотел бы придерживаться чего-то максимально переносимого, поэтому я выбрал решение eval, но я ценю это предложение и его обходной путь к опасностям использования eval.
Если вы можете построить команду в виде строки - со всем желаемым расширением параметров - вы можете ее оценить. Это печатает X num
раз:
num=10
eval $(echo printf '"X%0.s"' {1..$num})
Пинаю себя за то, что забыл eval. Спасибо!
Немного другой подход
$ 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
,
,
,
,
,
Выражение последовательности невозможно с переменными.