Ответ 1
Вы можете получить столько NULL-байтов, сколько хотите от /dev/zero. Затем вы можете превратить их в другие символы. Следующие отпечатки 16 строчных букв a
head -c 16 < /dev/zero | tr '\0' '\141'
Мне нужно создать цепочку точек (.
символов) в качестве переменной.
I.e., в моем Bash script, для ввода 15
Мне нужно сгенерировать эту строку длиной 15: ...............
Мне нужно сделать это переменно. Я попытался использовать это в качестве базы (из Unix.com):
for i in {1..100};do printf "%s" "#";done;printf "\n"
Но как мне получить переменную 100?
Вы можете получить столько NULL-байтов, сколько хотите от /dev/zero. Затем вы можете превратить их в другие символы. Следующие отпечатки 16 строчных букв a
head -c 16 < /dev/zero | tr '\0' '\141'
len=100 ch='#'
printf '%*s' "$len" | tr ' ' "$ch"
Самый простой и короткий путь без цикла
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
производит """"""""
.
В большинстве систем вы можете избавиться от простого
N=100
myvar=`perl -e "print '.' x $N;"`
Я продемонстрировал способ выполнения этой задачи с помощью одной команды в другом вопросе, предполагая, что она будет содержать фиксированное количество символов.
Я добавил добавление к концу о создании переменного количества повторяющихся символов, о чем вы просили, поэтому мой предыдущий ответ здесь имеет значение:
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
Выходы:
....................
Вы можете использовать циклы 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// /#}
Решение без циклов:
N=100
myvar=`seq 1 $N | sed 's/.*/./' | tr -d '\n'`
num=100
myvar=$(jot -b . -s '' $num)
echo $myvar
Когда мне нужно создать строку, содержащую $x
повторения известного символа с $x
ниже значения константы, я использую эту идиому:
base='....................'
# 0 <= $x <= ${#base}
x=5
expr "x$base" : "x\(.\{$x\}\)" # Will output '\n' too
Вывод:
.....