for k in {0..49};
do
a=$(($((2*$k))+1));
echo $a;
done
Salut, j'ai besoin d'une expression simplifiée pour la troisième ligne, peut-être une qui n'utilise pas de substitution de commande.
for k in {0..49};
do
a=$(($((2*$k))+1));
echo $a;
done
Salut, j'ai besoin d'une expression simplifiée pour la troisième ligne, peut-être une qui n'utilise pas de substitution de commande.
bash
pas le casC
, alors supprimez tout;
- sauf si vous l'écrivez sur une ligne singulière.declare -i a; for k in {0..49}; do a=2*$k+1; echo $a; done
$(( ... ))
l'expansion arithmétique n'est pas une substitution de commande.Réponses:
Utilisation de l'expansion arithmétique:
Utilisation de l'
expr
utilitaire désuet :Utilisation
bc -l
(-l
pas réellement nécessaire dans ce cas car aucune fonction mathématique n'est utilisée):Utilisé
bc -l
comme un co-processus (il agit comme une sorte de service de calcul en arrière-plan¹):Ce dernier semble (sans doute) plus propre dans
ksh93
:¹ Cela a résolu un problème pour moi une fois où je devais traiter une grande quantité d'entrée en boucle. Le traitement a nécessité quelques calculs en virgule flottante, mais le frai
bc
plusieurs fois dans la boucle s'est avéré extrêmement lent. Oui, j'aurais pu le résoudre de bien d'autres façons, mais je m'ennuyais ...la source
Vous pouvez simplifier:
à:
la source
Vous pouvez utiliser la
let
commande pour forcer un calcul.Notez que nous n'avons pas besoin
$k
de cette structure; un simplek
fera le travail.la source
a=2whateverk+1
dans le répertoire courant. Pire, s'il y a un fichier appeléa=2+b[$(reboot)]k+1
, qui appelle lareboot
commande. Le mieux est d'utiliser((...))
ici (((a = 2 * k + 1))
), ou la syntaxe POSIX:a=$((2 * k + 1))
let a="2*k+1"
pour résoudre ça.L'expansion arithmétique dont vous avez probablement besoin est la suivante:
En fait, vous n'avez pas besoin d'utiliser une variable:
Ou la variable de comptage pourrait être déplacée dans une
for ((…))
boucle:pour ((…)) boucle
Et, dans ce cas, l'expansion arithmétique pourrait également être déplacée à l'intérieur de la boucle for:
Ou, pour obtenir toutes les valeurs d'un tableau:
Pas de formule
Mais probablement le moyen le plus court d'éviter toute expansion arithmétique est d'incrémenter une variable deux fois:
Ou, encore plus simple, utilisez simplement seq:
la source