Estaba tratando de hacer un script bash muy simple para enumerar todos los múltiplos de cinco entre 375 y 3500 (375, 380, 385 ...). Una cosa que probé y no funcionó es:
for i in {375..3500}
do
echo $i
(($i += 5))
done
Me di por vencido después de un tiempo y escribí esto en BASIC en unos 15 segundos:
10 count = 375
20 print count
30 count = count+5
40 if count < 3500 then goto 20
¿Cómo puedo hacer mi programa BASIC en un script bash?
Respuestas:
Alternativamente, se puede usar un estilo C tradicional para el bucle:
Esto es quizás menos claro que usar seq, pero no genera ningún subproceso. Aunque como estoy familiarizado con C, no tendría ninguna dificultad para entender esto, pero YMMV.
fuente
dash
no lo admite. @ChrisDown - No hay ninguna razón por qué "POSIX sh" tiene dar a entender "no ss". Pero sí, claro, había pasado por alto el hecho de que seq no está especificado por POSIX.Como usas la expansión de llaves de todos modos, haz uso de su función por completo:
También puede usar esta técnica para imprimir cada número en una línea separada con texto opcional usando en
printf
lugar deecho
, por ejemplo:Editar
Como señaló @kojiro en el comentario, Mac OS usa bash 3 como shell predeterminado, que no admite el incremento en la expresión de secuencia de expansión de llaves. Debe actualizar a bash versión 4 o utilizar otro shell que lo admita (por ejemplo, zsh reciente).
fuente
bash -c
casi todas las garantías de que están involucrados dos proyectiles diferentes. ¿$SHELL --version
Dice que es bash 3?bash
esta característica se introdujo. Lo aprendí yo mismo del comentario de kojiro. Y, por favor, no me comparen con SC, realmente no conozco todos los detalles y la historia de todos los proyectiles desde finales de 1970. Una vez más, si lo esperan, denle un voto negativo.Usando SEQ (1)
O simplemente:
fuente
seq 375 5 3500
.Su fragmento de bucle for no funcionó como lo requiere por dos razones:
(($i += 5))
- aquí$i
se expande al valor dei
. Por lo tanto, la expansión será algo así((375 += 5))
, lo que no tiene sentido (intentar asignar un número literal a otro número literal). Esto normalmente se lograría con((i += 5))
(no$
para expandir la variable){375..3500}
se expandirá antes de la primera iteración del bucle. Será la lista de números375 376 ... 3499 3500
. Para cada iteración del ciclo,i
se asignará a cada uno de estos números, uno por uno. Por lo tanto, al comienzo de cada iteración,i
se reasignará al siguiente valor en esa lista, contando en los pasos de 1.((i += 5))
Efectivamente no hace nada: agrega 5 a i, pero luego me reasignan nuevamente al comienzo del siguiente iteraciónCreo que me gusta más la
for (( ; ; ))
respuesta, pero aquí hay algunas alternativas para que pienses:Dado que estamos lidiando con múltiplos de 5, y la
{a..b..i}
expansión no es compatible con la versión 3.2.57 (1) de bash (en OS X), entonces podemos hacer esto algo arcano en su lugar:Esto demuestra cómo se puede usar bash para crear un producto cartesiano.
Creo que, en general, un bucle for es la forma más conveniente de hacer esto, pero si está interesado, puede usar un programa while-loop (un poco más cercano a su BASIC):
fuente
38
hasta349
. En el segundo solo dos números:0
y5
. Ahora vamos a crear pares ordenados de esas combinaciones de todos - se puede escribir como un conjuntos:{38,0}
,{38,5}
...{349,5}
, o simplemente quitar los símbolos redundantes{
,,
y}
y obtener nuevos números ...380
...3495
.Si bien, por supuesto, hay una aplicación para eso (
seq 375 5 3500
), hay varias formas de hacerlo desde la línea de comandos. Si bien lo más rápido y sencillo será simplemente usarseq
, aquí hay algunas otras opciones:fuente
$(($i % 5))
se puede escribir$((i % 5))
.POSIXY:
...o...
No sé por qué lo harías de otra manera. Excepto, por supuesto ...
... o con
dc
:fuente
dc
código. Ciertamente es más intrigante que usarseq
.s
aves la[
cadena]
a la parte superior de lap
matriz, entoncesl
OADS de nuevo en la parte superior de la pila y ex
ecutes como una macro. Dentro de la macro, empujamos5
la pila, luego la sacamos y la segunda desde arriba y+
los reemplazamos, ambos valores de la pila con su suma, que sep
enjuaga y sed
duplica antes de que3500
se empuje en la pila, cuando la sacamos y el engaño que acabamos de hacer. comparación>
. Si3500
es mayor, cargamos y ejecutamos como macro la cadena almacenada en lap
matriz (nuestra macro actual) , o si no se rompe.Si estás atrapado en Bash 3:
y si lo prefieres
awk
:No sabía sobre la expansión de aparatos ortopédicos, eso es realmente genial.
fuente