2010-07-09 17 views
25

Necesito generar una cadena de puntos (. caracteres) como una variable.Crear cadena de caracteres repetidos en el script de shell

es decir, en mi escritura del golpe, para la entrada 15 necesito para generar esta serie de longitud 15: ...............

tengo que hacerlo de forma variable. He intentado usar esto como una base (from Unix.com):

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

Pero ¿cómo puedo obtener el 100 a ser una variable?

+0

relacionados en [SU]: http://superuser.com/q/86340/ 269404 – Palec

+0

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

+0

En 'zsh' al menos,' {1 .. $ length} 'funciona bien . –

Respuesta

5

En la mayoría de los sistemas, que podría salirse con un simple

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

La solución sin bucles:

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

Esta es la solución [POSIX 7] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html#tag_20_94) más corta que he visto hasta ahora. –

+1

puede ser incluso más corto, saque la cita en "$ len" para que sea $ len;) –

-1

Cuando tengo que crear una cadena que contiene $x repeticiones de una personaje conocido con $x debajo de un valor constante, uso este modismo:

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

Salida:

..... 
+2

En bash y ksh (quizás zsh), puede escribir 'echo $ {base: 0: $ x}' - details [ aquí] (http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion) –

3

Usted puede utilizar C-estilo for bucles en Bash:

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

o sin un bucle, usando printf sin necesidad de utilizar ningún externos tales como sed o tr:

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

Puedes obtener tantos NU LL bytes como desee desde/dev/zero. A continuación, puede convertirlos en otros personajes. forma

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

+1 para una solución dulce y portátil sin bashisms asquerosos o cientos de procesos que se generan – fstd

+2

puede use/dev/zero directamente, no necesita redirigir – edoceo

+3

No * que * dulce y portátil: "cabeza: opción ilegal - c" (SunOS 5.10 Generic_150401-20 i86pc i386 i86pc) – dokaspar

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

más fácil y rápida la siguiente imprime 16 minúscula de A sin un bucle

VAR=15 

imprime tantos puntos como VAR dice (cambie el primer punto a cualquier otro personaje si me gusta):

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

Guarda la línea punteada en una variable que se utilizará lat er:

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

robado -Blatantly de la respuesta de dogbane https://stackoverflow.com/a/5349842/3319298

Editar: Desde ahora he cambiado a pescado shell, aquí es una función definida en config.peces que hace esto con comodidad en la que shell:

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

Uso: line = 8 produce ========, line \" 8 produce """""""".

+1

qué manera más interesante de explotar la función de shell de printf que consume repetidamente argumentos hasta que se satisfaga en combinación con un ancho de campo cero, forzando solo la cadena antes de que se imprima el%. Esto podría usarse como un truco para dividir el conteo también (agregando el% .0s dos veces para forzarlo a consumir 2 argumentos por pase) – osirisgothra

+0

oh sí y olvidé algo importante, ya que printf procesa% s con un nulo si no hay argumentos se dan, un valor de cero sería un problema, para eso tendrías que agregar una instrucción if – osirisgothra

+1

Esto solo funciona para mí en mi caparazón (bash) si utilizo eval: 'VAR = 15; eval printf '=%. 0s' {1 .. $ VAR} ' – 6EQUJ5

4

Demostré una manera de realizar esta tarea con un solo comando en otra pregunta, suponiendo que se trata de un número fijo de caracteres para ser producidos.

que añade un apéndice al final de producir un número variable de caracteres repetidos, que es lo que usted pidió, por lo que mi respuesta anterior es relevante aquí:

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

que proporciona una explicación completa de cómo funciona allí. Aquí voy a añadir el código para lograr lo que usted está pidiendo:

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 

Salidas:

.................... 
Cuestiones relacionadas