for k in {0..49}; do a=$(($((2*$k))+1)); echo $a; done
Bonjour, jai besoin dune expression simplifiée pour la troisième ligne, peut-être celle qui le fait nutilisez pas la substitution de commande.
Commentaires
Réponse
Utilisation du développement arithmétique:
for (( k = 0; k < 50; ++k )); do a=$(( 2*k + 1 )) echo "$a" done
Utilisation de lutilitaire désuet expr
:
for (( k = 0; k < 50; ++k )); do a=$( expr 2 "*" "$k" + 1 ) echo "$a" done
Utilisation de bc -l
( -l
pas réellement nécessaire dans ce cas car aucune fonction mathématique nest utilisée):
for (( k = 0; k < 50; ++k )); do a=$( bc -l <<<"2*$k + 1" ) echo "$a" done
Utilisation de bc -l
comme co-processus (il agit comme une sorte de service de calcul en arrière-plan¹):
coproc bc -l for (( k = 0; k < 50; ++k )); do printf "2*%d + 1\n" "$k" >&${COPROC[1]} read -u "${COPROC[0]}" a echo "$a" done kill "$COPROC_PID"
Ce dernier semble (sans doute) plus propre dans ksh93
:
bc -l |& bc_pid="$!" for (( k = 0; k < 50; ++k )); do print -p "2*$k + 1" read -p a print "$a" done kill "$bc_pid"
¹ Cela a résolu un problème pour moi une fois où javais besoin de traiter une grande quantité dentrées dans une boucle. Le traitement a nécessité des calculs en virgule flottante, mais la reproduction de bc
plusieurs fois dans la boucle sest avérée extrêmement lente. Oui, jaurais pu le résoudre de bien dautres manières, mais je mennuyais …
Réponse
Vous pouvez simplifier:
a=$(($((2*$k))+1));
à:
a=$((2*k+1))
Réponse
Vous pouvez utiliser la commande let
pour forcer un calcul.
let a="2*k+1"
Notez que nous navons pas besoin de $k
dans cette structure; un simple k
fera laffaire.
Commentaires
- Cela échoue sil y a ' fichier sa appelé
a=2whateverk+1
dans le Pire, sil existe un fichier ' appeléa=2+b[$(reboot)]k+1
, qui appelle la commandereboot
. Le mieux est dutiliser((...))
ici (((a = 2 * k + 1))
) ou la syntaxe POSIX:a=$((2 * k + 1))
- Nous pouvons le citer;
let a="2*k+1"
pour résoudre ce problème.
Réponse
Le développement arithmétique dont vous avez probablement besoin est celui-ci:
a=$(( 1+2*k ))
En fait, vous navez pas besoin dutiliser une variable:
for k in {0..49}; do echo "$(( 1 + 2*k ))" done
Ou la variable de comptage pourrait être déplacée vers un for ((…))
loop:
for (( k=0;k<50;k++ )); do a=$(( 1+2*k )) printf "%s\n" "$a" done
for ((…)) loop
Et, dans ce cas, le développement arithmétique pourrait aussi être déplacé à lintérieur de la boucle for:
for (( k=0 ; a=1+2*k , k<50 ; k++)); do printf "%s\n" "$a" done
Ou, pour obtenir toutes les valeurs dun tableau:
for (( k=0 ; a[k]=1+2*k , k<49 ; k++ )); do :; done printf "%s\n" "${a[@]}"
Pas de formule
Mais probablement le moyen le plus court déviter toute expansion arithmétique est dincrémenter une variable deux fois:
for (( k=0,a=1 ; k<50 ; k++,a++,a++ )); do printf "%s\n" "$a" done
Ou, encore plus simple, utilisez simplement seq:
seq 1 2 100
bash
et nonC
, 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
$(( ... ))
est une expansion arithmétique et non une substitution de commande.