2010-07-09 2 views
25

Мне нужно сгенерировать строку точек (. символов) в виде переменной.Создание строки повторяющихся символов в сценарии оболочки

есть, в моей Баш скрипт, для ввода 15 Мне нужно создать эту строку длиной 15: ...............

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

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

Но как же я получаю 100, чтобы быть переменной?

+0

Относящиеся на [SU]: http://superuser.com/q/86340/ 269404 – Palec

+0

Duplicates: http://stackoverflow.com/q/5349718/2157640 http://stackoverflow.com/q/5799303/2157640 – Palec

+0

В 'zsh' по крайней мере,' {1 .. $ length} 'работает просто отлично , –

ответ

5

В большинстве систем, вы могли бы уйти с простой

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

раствора без петель:

N=100 
myvar=`seq 1 $N | sed 's/.*/./' | tr -d '\n'` 
21
len=100 ch='#' 
printf '%*s' "$len" | tr ' ' "$ch" 
+1

Это кратчайший [POSIX 7] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html#tag_20_94) решение, которое я видел до сих пор. –

+1

может быть еще короче, выведите котировку в «$ len» как $ len;) –

-1

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

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

Выход:

..... 
+2

В bash и ksh (возможно, zsh) вы можете написать 'echo $ {base: 0: $ x}' - details [ здесь] (http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion) –

3

Вы можете использовать C-стиля for петель в 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// /#} 
46

Вы можете получить столько NU LL, как вы хотите, из/dev/zero. Затем вы можете превратить их в другие символы. Следующие режимы печати 16 LOWERCASE элементы а

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

+1 для сладкого и портативного решения без грязных бахизмов или сотен процессов, порождаемых – fstd

+2

вы можете использовать/dev/zero напрямую, нет необходимости переадресовывать – edoceo

+3

Не * что * милый и портативный: «head: незаконный вариант - c» (SunOS 5.10 Generic_150401-20 i86pc i386 i86pc) – dokaspar

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

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

VAR=15 

Печати столько точек, как УАК говорит (изменить первую точку в любой другой символ, если вы например:

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

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

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

-Blatantly украдена из ответа кендырь в https://stackoverflow.com/a/5349842/3319298

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

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

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

+1

Какой интересный способ использовать функцию оболочки printf, которая с повторяемостью потребляет аргументы до тех пор, пока не будет удовлетворена в сочетании с шириной нулевого поля, заставляя только строку перед напечатанным%. Это можно использовать как трюк, чтобы разделить счетчик (добавив% .0s дважды, чтобы заставить его потреблять 2 аргумента за проход) – osirisgothra

+0

о да, и я забыл что-то важное, так как printf обрабатывает% s с нулевым, если нет аргументов , значение 0 будет проблемой, для чего вам нужно будет добавить оператор if. – osirisgothra

+1

Это работает только для меня в моей оболочке (bash), если я использую eval: 'VAR = 15; eval printf '=%. 0s' {1 .. $ VAR} ' – 6EQUJ5

4

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

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

https://stackoverflow.com/a/17030976/2284005

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

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 

Выходы:

.................... 
Смежные вопросы