Bash Shell 中的 BMI 计算器

Mag*_*336 5 linux bash shell

我正在尝试使用 Linux 中的 Bash shell 创建一个脚本来计算 BMI。我知道我只是在做一些愚蠢的事情,但我似乎无法让它发挥作用。它不会做除法。你能看出我错在哪里吗

     #!/bin/bash
     #==============================================================
     # Script Name: bmicalc
     # By:          mhj
     # Date:        March 25, 2014
     # Purpose:     calculates your bmi from your weight & height
     #===============================================================
     #Get your weight and height
     echo -n "What is your weight in pounds? "
     read weight
     echo -n "What is your height in inches? "
     read height
     #calculate your bmi
     let total_weight=$weight*703
     let total_height=$height*$height
     bmi=$total_weight/$total_height
     echo "Your weight is $weight"
 echo "Your height is $height"
 echo -n "Your BMI is $bmi"
Run Code Online (Sandbox Code Playgroud)

koj*_*iro 2

你已经快到了,你只需要另一个let

\n\n
let bmi=$total_weight/$total_height\n
Run Code Online (Sandbox Code Playgroud)\n\n

备择方案

\n\n

在 shell 中拥有算术上下文的方法有很多种。首选的标准方法是$(( ))语法:

\n\n
total_weight=$(( $weight * 703 ))\n
Run Code Online (Sandbox Code Playgroud)\n\n

这和expr(见下文)几乎是唯一可以在 POSIX sh 中工作的。(还有$[ ],但它已被弃用,并且大部分工作方式与双括号相同。)

\n\n

通过将变量声明为整数可以提高语法效率。具有整数属性的参数会导致所有赋值表达式的 RHS 具有算术上下文:

\n\n
declare -i weight height bmi total_weight total_height\ntotal_weight=weight*703\ntotal_height=height*height\nbmi=total_weight/total_height\n
Run Code Online (Sandbox Code Playgroud)\n\n

不再let

\n\n

您也可以(( ))直接使用语法。

\n\n
(( total_weight=weight*703 ))\n(( total_height=height*height ))\n(( bmi=total_weight/total_height ))\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后,expr只是外壳上的疼痛。

\n\n
total_weight=$(expr $weight '*' 703) # Have to escape the operator symbol or it will glob expand\ntotal_height=$(expr $height '*' $height) # Also there's this crazy subshell\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\xa6 嗯,但是完整性!

\n\n

最后,在 bash 数组中,索引始终具有算术上下文。(但这并不真正适用于此。)

\n\n

但是,这些方法都不会进行浮点计算,因此您的除法将始终被截断。如果您需要小数值,请使用bcawk或其他编程语言。

\n