Создание строки повторяющихся символов в оболочке script

Мне нужно создать цепочку точек (. символов) в качестве переменной.

I.e., в моем Bash script, для ввода 15 Мне нужно сгенерировать эту строку длиной 15: ...............

Мне нужно сделать это переменно. Я попытался использовать это в качестве базы (из Unix.com):

for i in {1..100};do printf "%s" "#";done;printf "\n"

Но как мне получить переменную 100?

Ответ 1

Вы можете получить столько NULL-байтов, сколько хотите от /dev/zero. Затем вы можете превратить их в другие символы. Следующие отпечатки 16 строчных букв a

head -c 16 < /dev/zero | tr '\0' '\141'

Ответ 2

len=100 ch='#'
printf '%*s' "$len" | tr ' ' "$ch"

Ответ 3

Самый простой и короткий путь без цикла

VAR=15

Печатает столько точек, сколько говорит VAR (измените первую точку на любой другой символ, если хотите):

printf '.%.0s' {1..$VAR}

Сохраняет пунктирную линию в переменной, которая будет использоваться позже:

line=`printf '.%.0s' {1..$VAR}`
echo "Sign here $line"

-Борантно украден из ответа на собаку fooobar.com/questions/21876/...

Изменить. Так как теперь я переключился на оболочку fish, вот функция, определенная в config.fish, которая делает это с удобством в этой оболочке:

function line -a char -a length
  printf '%*s\n' $length "" | tr ' ' $char
end

Использование: line = 8 производит ========, line \" 8 производит """""""".

Ответ 4

В большинстве систем вы можете избавиться от простого

N=100
myvar=`perl -e "print '.' x $N;"`

Ответ 5

Я продемонстрировал способ выполнения этой задачи с помощью одной команды в другом вопросе, предполагая, что она будет содержать фиксированное количество символов.

Я добавил добавление к концу о создании переменного количества повторяющихся символов, о чем вы просили, поэтому мой предыдущий ответ здесь имеет значение:

fooobar.com/questions/21877/...

Я дал полное объяснение того, как он там работает. Здесь я просто добавлю код, чтобы выполнить то, о чем вы просите:

    n=20 # This the number of characters you want to produce

    variable=$(printf "%0.s." $(seq 1 $n)) # Fill $variable with $n periods

    echo $variable # Output content of $variable to terminal

Выходы:

....................

Ответ 6

Вы можете использовать циклы for C-стиля в Bash:

num=100
string=$(for ((i=1; i<=$num; i++));do printf "%s" "#";done;printf "\n")

Или без цикла, используя printf без использования каких-либо внешних элементов, таких как sed или tr:

num=100
printf -v string "%*s" $num ' ' '' $'\n'
string=${string// /#}

Ответ 7

Решение без циклов:

N=100
myvar=`seq 1 $N | sed 's/.*/./' | tr -d '\n'`

Ответ 8

num=100
myvar=$(jot -b . -s '' $num)
echo $myvar

Ответ 9

Когда мне нужно создать строку, содержащую $x повторения известного символа с $x ниже значения константы, я использую эту идиому:

base='....................'
# 0 <= $x <= ${#base}
x=5
expr "x$base" : "x\(.\{$x\}\)"    # Will output '\n' too

Вывод:

.....