for k in {0..49};
do
a=$(($((2*$k))+1));
echo $a;
done
Oi, preciso de uma expressão simplificada para a terceira linha, talvez uma que não use substituição de comando.
for k in {0..49};
do
a=$(($((2*$k))+1));
echo $a;
done
Oi, preciso de uma expressão simplificada para a terceira linha, talvez uma que não use substituição de comando.
bash
e nãoC
, então remova tudo;
- a menos que você o escreva em uma linha singular.declare -i a; for k in {0..49}; do a=2*$k+1; echo $a; done
$(( ... ))
expansão aritmética não comanda a substituição.Respostas:
Usando expansão aritmética:
Usando o
expr
utilitário antiquado :Usando
bc -l
(-l
não é realmente necessário neste caso, pois nenhuma função matemática é usada):Usando
bc -l
como um co-processo (ele age como uma espécie de serviço de computação em segundo plano¹):Esse último parece (sem dúvida) mais limpo em
ksh93
:¹ Isso resolveu um problema para mim uma vez em que eu precisava processar uma grande quantidade de entrada em um loop. O processamento exigiu alguns cálculos de ponto flutuante, mas a geração
bc
algumas vezes no loop se mostrou extremamente lenta. Sim, eu poderia ter resolvido isso de muitas outras maneiras, mas estava entediado ...fonte
Você pode simplificar:
para:
fonte
Você pode usar o
let
comando para forçar um cálculo.Observe que não precisamos
$k
dessa estrutura; um simplesk
fará o trabalho.fonte
a=2whateverk+1
no diretório atual. Pior, se houver um arquivo chamadoa=2+b[$(reboot)]k+1
, que chama oreboot
comando. O melhor é usar((...))
aqui (((a = 2 * k + 1))
), ou a sintaxe do POSIX:a=$((2 * k + 1))
let a="2*k+1"
para resolver isso.A expansão aritmética de que você provavelmente precisa é esta:
De fato, você não precisa usar uma variável:
Ou a variável de contagem pode ser movida para um
for ((…))
loop:loop for ((…))
E, nesse caso, a expansão aritmética também pode ser movida para dentro do loop for:
Ou, para obter todos os valores em uma matriz:
Nenhuma fórmula
Mas provavelmente a maneira mais curta de evitar qualquer expansão aritmética é incrementar uma variável duas vezes:
Ou, ainda mais simples, basta usar seq:
fonte