Faire des calculs simples sur la command line en utilisant les fonctions bash: $ 1 divisé par $ 2 (en utilisant bc peut-être)

Parfois, j'ai besoin de split un nombre par un autre. Ce serait génial si je pouvais simplement définir une fonction bash pour cela. Jusqu'à présent, je suis obligé d'utiliser des expressions comme

echo 'scale=25;65320/670' | bc 

mais ce serait génial si je pouvais définir une fonction .bashrc qui ressemblait

 divide () { bc -d $1 / $2 } 

J'ai une fonction bash pratique appelée calc :

 calc () { bc -l <<< "$@" } 

Exemple d'utilisation:

 $ calc 65320/670 97.49253731343283582089 $ calc 65320*670 43764400 

Vous pouvez changer cela pour vous convenir. Par exemple:

 divide() { bc -l <<< "$1/$2" } 

Note: <<< est une string ici qui est introduite dans le stdin de bc . Vous n'avez pas besoin d'appeler echo .

Bash peut faire le calcul lui-même dans une certaine mesure. Ce n'est pas utile pour la précision, cependant, comme il tourne.

 [user]$ echo $(( 10/5 )) 2 

Mais vous avez raison – une fonction bash serait un raccourci simple et votre exemple fonctionne fondamentalement.

 divide() { echo "scale=25;$1/$2" | bc } 

Jetez cela dans votre .bashrc et alors vous pouvez:

 [user]$ divide 10 5 2.0000000000000000000000000 

Pas vraiment une réponse à cette question précise, mais il pourrait être bon de savoir. Utilisez zsh 😉

 % echo $((65320./670)) 97.492537313432834 

Vous connaissez probablement le bash construit "expr" comme dans

 $ expr 60 / 5 12 

qui est limité aux entiers et a besoin des espaces entre les arguments.

Qu'est-ce qui vous empêche de définir une fonction dans le sens de l'expression d'écho que vous utilisez déjà? C'est à dire

  divide () { echo $1/$2 | bc } 

Si vous avez installé calc sur votre système et que vous n'aimez pas arrondir, vous pouvez:

 div() { calc "$1 / $2"; } 

Un hack sale pour les petites valeurs et une précision limitée sans utiliser bc serait, pour multiplier le proposeur avant la division, pour get un résultat précis.

Exemple sans précision:

 echo $((13/7)) 1 

et avec 2 numbers de précision: multipliez par 100 et déplacez le point décimal 2 pas vers la gauche:

 echo $((100*13/7)) | sed 's/..$/.&/' 1.85 echo $((100*13/7))% 185% 

Ceci n'est utile que si la plage de nombres est connue auparavant et que la précision est toujours la même. Éviter d'appeler BC , et appeler sed ne semble pas très raisonnable.

Notez que la multiplication des valeurs peut entraîner des erreurs de débordement, mais pas très tôt:

 echo $((1000000000*12345678901)) -6101065172709551616 

Au lieu d'utiliser bc, vous pouvez utiliser awk:

 div() { awk -vp=$1 -vq=$2 'BEGIN{print p/q}'; } 
 echo Division efgh=$num1/$num2 remainder=$num1%num2 echo $num1 "/" $num2 "=" $efgh.$remainder echo