separador scripts script manejo ejemplos columnas campos cadenas cadena buscar unix shell

unix - scripts - Crear una cadena de caracteres repetidos en el script de shell



scripts bash ejemplos (9)

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

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

Salida:

.....

Esta pregunta ya tiene una respuesta aquí:

Necesito generar una cadena de puntos (caracteres) como una variable.

Es decir, en mi script Bash, para la entrada 15 necesito generar esta cadena de longitud 15: ...............

Necesito hacerlo de manera variable. Intenté usar esto como base ( desde Unix.com ):

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

¿Pero cómo consigo que los 100 sean una variable?


Demostré una forma de realizar esta tarea con un solo comando en otra pregunta, asumiendo que es un número fijo de caracteres que se producirán.

Agregué un apéndice al final sobre la producción de un número variable de caracteres repetidos, que es lo que pediste, por lo que mi respuesta anterior es relevante aquí:

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

Proporcioné una explicación completa de cómo funciona allí. Aquí solo agregaré el código para lograr lo que estás 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

Productos:

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


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

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


La solución sin bucles:

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


Puede obtener tantos bytes NULL como desee desde / dev / zero. A continuación, puede convertirlos en otros personajes. Lo siguiente imprime 16 a minúsculas

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


Puedes usar C-style 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 usar ningún elemento externo como sed o tr :

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


Camino más fácil y más corto sin un bucle.

VAR=15

Imprime tantos puntos como dice VAR (cambie el primer punto a cualquier otro personaje si lo desea):

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

Guarda la línea punteada en una variable que se utilizará más adelante:

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

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

Edición : como ahora he cambiado a shell de peces , aquí hay una función definida en config.fish que hace esto con comodidad en ese shell:

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

Uso: la line = 8 produce ======== , la line /" 8 produce """""""" .


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


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