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í:
- ¿Cómo puedo repetir un personaje en bash? 19 respuestas
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