Estoy tratando de ejecutar dos secuencias en el mismo bucle en mi shell como a continuación:
#!/bin/bash
for i in (1..15) and (20..25) ;
do
echo $i
......
.....other process
done
¿Alguna idea de cómo puedo lograr esto?
command-line
bash
sh
HISI
fuente
fuente
Respuestas:
Solo necesitas expansión de llaves para eso
Podemos pasar una lista a
for
( ).for i in x y z; do stuff "$i"; done
Entonces, aquí, las llaves
{
}
obtienen el shell para expandir sus secuencias en una lista. Solo necesita poner un espacio entre ellos, ya que el shell divide listas de argumentos sobre ellos.fuente
echo
los númerostouch
archivos, simplemente pueden hacertouch {1..15}.txt {20..25}.txt
, no se necesita un bucle aquí. Pero, por supuesto, si se trata de múltiples acciones en el mismo número, está bien, eso podría usar un bucle.Alternativamente, podemos usar
seq
( imprimir una secuencia de números ), aquí hay dos ejemplos equivalentes:Si es un script, para tareas repetitivas, puede usar funciones:
fuente
La respuesta de Zanna y respuesta de pa4080 son buenos y probablemente iría con uno de ellos en la mayoría de las circunstancias. Quizás no hace falta decirlo, pero en aras de la exhaustividad, lo diré de todos modos: puede cargar cada valor en una matriz y luego recorrerla en bucle. Por ejemplo:
fuente
Bucle sin bucle
La respuesta de Zanna es absolutamente correcta y adecuada para bash, pero podemos mejorar eso aún más sin utilizar un bucle.
El comportamiento de
printf
es tal que si el número deARGUMENTS
es mayor que los controles de formato'FORMAT STRING'
,printf
los dividiráARGUMENTS
en trozos iguales y los ajustará a la cadena de formato una y otra vez hasta que se agote laARGUMENTS
lista.Si nos esforzamos por la portabilidad, podemos utilizar en su
printf "%d\n" $(seq 1 15) $(seq 20 25)
lugarLlevemos esto más lejos y más divertido. Digamos que queremos realizar una acción en lugar de solo imprimir números. Para crear archivos a partir de esa secuencia de números, podríamos hacerlo fácilmente
touch {1..15}.txt {20..25}.txt
. ¿Qué pasa si queremos que ocurran varias cosas? También podríamos hacer algo como esto:O si queremos hacerlo al estilo de la vieja escuela:
Alternativa portátil pero detallada
Si queremos crear una solución de script que funcione con shells que no tengan expansión de llaves (que es de lo que
{1..15} {20..25}
depende), podemos escribir un ciclo while simple:Por supuesto, esta solución es más detallada, algunas cosas podrían acortarse, pero funciona. Probado con
ksh
,dash
,mksh
, y, por supuestobash
.Bash bucle estilo C
Pero si quisiéramos hacer un ciclo específico de bash (por cualquier razón, quizás no solo imprimiendo sino también haciendo algo con esos números), también podemos hacer esto (básicamente la versión C-loop de la solución portátil):
O en formato más legible:
Comparación de rendimiento de diferentes enfoques de bucle
Alternativa sin carcasa
Solo porque podemos, aquí está la solución de Python
O con un poco de concha:
fuente
touch $(printf "%d\n" {1..15} {20..25})
:-)bash
usted ni siquiera necesita$()
allí, solotouch {1..15}.txt {20..25}.txt
:) Pero, por supuesto, podríamos usarprintf "%d\n
{1..15} {20..25} `xargs
si quisiéramos hacer más que solotouch
archivos. ¡Hay muchas maneras de hacer las cosas y hace que las secuencias de comandos sean muy divertidas!