Conozco el comando seq
para generar una secuencia de enteros, uno por línea, pero me gustaría hacer dos preguntas:
¿Es posible escribir los números de la secuencia en la misma línea?
¿Es posible crear una cadena hecha de la secuencia de números separados por un espacio en blanco?
echo $(seq 1 10)
Respuestas:
Con
bash
,zsh
yksh93
, puede usar el formulario de expansión de llaves {start..end..step} :fuente
GNU
seq
toma la-s
opción separator ( ):fuente
echo $(seq 5)
funciona bien.Portátil para todos los shells y cualquier sistema que tenga seq (ya que esta pregunta está etiquetada)
Si inicio es 1:
De otra manera:
Con bc:
En bash
Nota:
Esta solución de eco funciona si el valor de IFS contiene una nueva línea, lo que hace por defecto.
Por defecto, IFS está configurado en la secuencia <espacio><tabla> <nueva línea> . Y se restablece para cada inicio limpio del shell. Pero, si le preocupa que haya cambiado en algún caso extremo, tenemos varias soluciones.
Sin embargo, restablecer el valor de IFS bajo sh puede ser complejo. Lea el detalle completo aquí .
Desarmar IFS.
siempre funcionará Siempre que no haya ningún código a continuación (o scripts secundarios) que necesiten un conjunto IFS, como un script que lo haga
OldIFS="$IFS"
.Solución correcta
Usando un truco para sh:
fuente
IFS='<space><tab><newline>'
cuando los<space>
,<tab>
,<newline>
son los caracteres literales correspondientes.Utilizar esta:
fuente
...o...
Los dos comandos anteriores separarán los enteros por espacios en blanco.
xargs
el valor predeterminado es imitar/bin/echo
y, por lo tanto, cada número entero está separado por un solo espacio. Sin embargo, tendrá una longitud máxima de línea de comando de 128K. Puedes ajustar esto ...... imprime 1. I el valor
-s
aquí no es arbitrario: lo obtuve después de probar un valor más alto (que aparentemente funcionó de todos modos) pero luegoxargs
imprimí el mensaje útil:paste
es una de las dos utilidades sancionadas por POSIX (que yo sepa) para manejar líneas de longitud arbitraria:paste
el valor predeterminado es un delimitador de tabulación, por lo que habrá una tabulación entre cada entero después del segundo comando. Usted puede...... usa el
-d
interruptor eliminador para alterar ese comportamiento,fuente
seq 10 | xargs
funciona bien, pero debido a los límites de la línea de comando,seq 100000 | xargs
genera 5\n
líneas delimitadas (en mi sistema)paste and
cut` son las dos utilidades sancionadas por POSIX para trabajar con líneas de longitud arbitraria. Dicho eso,xargs | xargs
es una opción. O bienseq 100000|tr \\n \
$IFS
un número? Y enbash
su godawful lento de todos modos. En su respuesta, habla desh
que, ni siquiera necesita establecer$IFS
en ese contexto, se transmitirá a través del entorno si se configura allí. Y no es más corto de loseq 100000|paste -s
que supera su rendimiento 5: 1. Ypaste
no viene con ninguna trampa.$IFS
, lo uso todo el tiempo, pero no lo uso a menos que lo configure y usted tampoco debería hacerlo. Especialmente no deberías recomendar a extraños al azar que no conocen mejor que deberían hacerlo. No lo deje al azar: es un programa de computadora. Es un error si se comporta inesperadamente, ¿por qué permitir que lo haga?