Eu estava tentando criar um script bash muito simples para listar todos os múltiplos de cinco entre 375 e 3500 (375, 380, 385 ...). Uma coisa que eu tentei e não funcionou é:
for i in {375..3500}
do
echo $i
(($i += 5))
done
Desisti depois de um tempo e escrevi isso no BASIC em cerca de 15 segundos:
10 count = 375
20 print count
30 count = count+5
40 if count < 3500 then goto 20
Como posso fazer meu programa BASIC em um script bash?
Respostas:
Como alternativa, um estilo C tradicional para loop pode ser usado:
Talvez isso seja menos claro do que usar seq, mas não gera subprocessos. Embora eu esteja familiarizado com C, não tenho dificuldade em entender isso, mas YMMV.
fonte
dash
não suporta. @ ChrisDown - Não há razão para que "POSIX sh" tenha que implicar "no seq". Mas sim, com certeza, eu havia ignorado o fato de que seq não é especificado pelo POSIX.Como você usa a expansão de chaves de qualquer maneira, use totalmente seu recurso:
Você também pode usar esta técnica para imprimir cada número em uma linha separada com texto opcional usando, em
printf
vez deecho
, por exemplo:Editar
Conforme apontado por @kojiro no comentário, o Mac OS usa o bash 3 como shell padrão, que não suporta incremento na expressão de sequência da expansão de chaves. Você precisa atualizar para o bash versão 4 ou usar outro shell que suporte isso (por exemplo, zsh recente).
fonte
bash -c
praticamente garantir que duas conchas diferentes estejam envolvidas. Diz$SHELL --version
que é bash 3?bash
desse recurso foi introduzida. Eu mesmo aprendi com o comentário kojiro. E, por favor, não me compare com o SC, eu realmente não conheço todos os detalhes e histórico de todas as conchas desde o final de 1970. Mais uma vez - Se você espera isso, apenas faça voto negativo.Usando SEQ (1)
Ou simplesmente:
fonte
seq 375 5 3500
.Seu snippet de loop for não funcionou conforme necessário por dois motivos:
(($i += 5))
- aqui o$i
é expandido para o valor dei
. Assim, a expansão será algo como((375 += 5))
, o que não faz sentido (tentar atribuir um número literal a outro número literal). Isso normalmente seria alcançado com((i += 5))
(não$
para expandir a variável){375..3500}
será expandido antes da primeira iteração do loop. Será a lista de números375 376 ... 3499 3500
. Para cada iteração do loop,i
será atribuído a cada um desses números, um por um. Assim, no início de cada iteração,i
será reatribuído para o próximo valor nessa lista, contando-se nas etapas de 1. O((i += 5))
efetivamente não faz nada - ele adiciona 5 a i, mas, em seguida, é reatribuído novamente no início do próxima iteração.Acho que gosto mais da
for (( ; ; ))
resposta, mas aqui estão algumas alternativas para você pensar:Como estamos lidando com múltiplos de 5 e a
{a..b..i}
expansão não é suportada na versão 3.2.57 (1) do bash (no OS X), podemos fazer uma coisa um pouco misteriosa:Isso demonstra como o bash pode ser usado para criar um produto cartesiano.
Eu acho que, em geral, um loop for é a maneira mais conveniente de fazer isso, mas se você estiver interessado, pode usar um programa while-loop (um pouco mais próximo do seu BASIC):
fonte
38
até349
. No segundo, apenas dois números:0
e5
. Agora vamos criar pares ordenados desses todas as combinações - você pode escrever-los como um conjuntos:{38,0}
,{38,5}
...{349,5}
, ou simplesmente remover símbolos redundantes{
,,
e}
e obter ... novos números380
...3495
.Embora exista, é claro, um aplicativo para isso (
seq 375 5 3500
), existem várias maneiras de fazer isso na linha de comando. Enquanto o mais rápido e o mais simples serão usadosseq
, aqui estão algumas outras opções:fonte
$(($i % 5))
pode ser escrito$((i % 5))
.POSIXly:
...ou...
Não sei por que você faria de outra maneira. Exceto, é claro ...
... ou com
dc
:fonte
dc
código funciona. É certamente mais intrigante do que usarseq
.s
o[
barbante]
no topo dap
matriz, depois ol
coloca de volta no topo da pilha e ox
faz como uma macro. Na macro, empurramos5
a pilha e, em seguida, a colocamos e a segunda de cima e+
elas, substituindo os dois valores da pilha pela soma, que ép
criada ed
aumentada antes de3500
ser empurrada na pilha, quando a colocamos e a bobagem que acabamos de criar para comparação>
. Se3500
for maior, carregamos e executamos como macro a string armazenada nap
matriz (nossa macro atual) ou, se não for quebrada.Se você está preso no Bash 3:
e se você preferir
awk
:Eu não sabia sobre a expansão da cinta - isso é muito legal.
fonte