Multiplication et ajout Bash

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

  • @Theophrastus: Comme suggéré, cela fonctionne bien mais que faire si je voulais utiliser expr au lieu de (()) .
  • Ceci est bash et non C, alors supprimez tout ; – sauf si vous lécrivez sur une ligne singulière.
  • Voir aussi: unix.stackexchange.com/q/40786/117549
  • declare -i a; for k in {0..49}; do a=2*$k+1; echo $a; done
  • A part: $(( ... )) est une expansion arithmétique et non une substitution de commande.

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 commande reboot . 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 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *