使用Bash进行单位转换

时间:2013-03-07 18:49:57

标签: bash

我正在编写一个bash脚本,可以从非常具体的输入中转换单位。

我开始做简单的read和echo语句,并且能够读取从声明的整数和数字派生的非常具体的输入,但是我无法使用if语句。

到目前为止,这是我的简单代码:

#!/bin/bash

declare -i n
in=inches
ft=feet

read number in "as" feet
if [ ]; then
    echo "$n $in = $[n/12] $ft"
fi

我现在要做的是创建if / else语句,以根据用户输入的多个条件进行流动。因此,我希望用户输入类似“24英寸作为英尺”或“50码作为英寸”的内容并执行其各自的输出。现在,我真的不知道在if语句中输入什么而不会出现“找不到命令”之类的错误。

任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:2)

首先,不要在read命令中对变量使用引号。

read number in as feet

另一项改进是重命名变量以表示它们存储的内容。我将使用下划线替换as,这是一个有效但不可读的"这个名称强调它只是一个占位符,我们并不真正关心它的价值。

read value src_unit _ dest_unit
# If the user enters "24 inches as feet", we have:
#  value=24
#  src_unit=inches
#  _=as
#  dest_unit=feet

现在,你的if语句需要检查两件事:值的单位是什么,我们想要将它转换为什么单位。这是一个模板:

if [ "$src_unit" = X ] && [ "$dest_unit" = Y ]; then
   # Convert X into Y
fi

您可以将XY替换为要转换的单位,以及 中间的代码类似new_value=$(( $value / 12 )),如果 从英寸转换为英尺。请注意bash无法处理浮点运算, 这是另一个问题的主题。

case语句,如cwgem所示:

case "$src_unit-$dest_unit" in
    inches-feet)
      new_value=$(( $value / 12 ))
      ;;
    gallons-quarts)
      new_value=$(( $value * 4 ))
      ;;
    *)  echo "I don't know how to convert $src_unit to $dest_unit"
      ;;
esac