华氏、摄氏、开氏(绝对温度)之间转换的脚本
这个脚本中会出现不同的数学公式。输入的气温可以是华氏、摄氏、开氏(绝对温度)。
代码:
01
#!/bin/sh
02
03
# convertatemp.sh -- 气温转换脚本
04
# 允许用户输入华氏(F)、摄氏(C)、开氏(K)
05
# 输出会得到另2个计量单位中的等价气温
06
07
if [ $# -eq 0 ]; then
08
cat << EOF >&2 # here document,同学们,熟悉吗? 它是用于脚本中的交互式命令。
09
Usage: `basename $0` temperature[F|C|K]
10
where the suffix:
11
F indicates input is in Fahrenheit(default)
12
C indicates input is in Celsius
13
K indicates input is in Kelvin
14
EOF
15
exit 1
16
fi
17
18
# sed -e 's/[-[[:digit:]]*//g' 原书中的unit,经测试,错误,自己修改了下
19
# sed -e 's/[^-[[:digit:]]*//g' 原书中的temp,同上
20
unit="$(echo $1 | sed -e 's/[[:digit:]]*//g' | tr '[:lower:]' '[:upper:]')" # 得到$1中的字母
21
temp="$(echo $1 | sed -e 's/[^[:digit:]]*//g')" # 得到$1中的数字
22
23
case ${unit:=F} in # 设置变量默认值的方式
24
F) # 华氏转为摄氏的计算公式: Tc = (F - 32) / 1.8
25
farm="$temp"
26
cels="$(echo "scale=2;($farm-32)/1.8" | bc)"
27
kelv="$(echo "scale=2;$cels+273.15" | bc)"
28
;;
29
C) # 摄氏转华氏: Tf = (9 / 5) * Tc + 32
30
cels=$temp
31
kelv="$(echo "scale=2;$cels+273.15" | bc)"
32
farm="$(echo "scale=2;((9/5)*$cels)+32" | bc)"
33
;;
34
K) # 摄氏 = 开氏 - 273.15,然后使用摄氏转华氏公式
35
kelv=$temp
36
cels="$(echo "scale=2;$kelv-273.15" | bc)"
37
farm="$(echo "scale=2;((9/5) * $cels)+32" | bc)"
38
esac
39
40
echo "Fahrenheit = $farm"
41
echo "Celsius = $cels"
42
echo "Kelvin = $kelv"
43
44
exit 0
运行脚本:
虽然在Unix命令行很少用到,但我(本书作者)还是很喜欢这个脚本,因为它的输入有着直观的特性。输入是一个数值,它可以带有表明单位的后缀。
你以后会在第66个脚本中看到同样的单字母后缀,那个脚本时转换币值。
运行结果:
01
./convertatemp.sh
02
Usage: convertatemp.sh temperature[F|C|K]
03
where the suffix:
04
F indicates input is in Fahrenheit(default)
05
C indicates input is in Celsius
06
K indicates input is in Kelvin
07
08
./convertatemp.sh 100c
09
Fahrenheit = 212.00
10
Celsius = 100
11
Kelvin = 373.15
12
13
./convertatemp.sh 100k
14
Fahrenheit = -279.67
15
Celsius = -173.15
16
Kelvin = 100
分析脚本:
也可以给脚本加上一个选项。然后可以这样运行:./converatemp.sh -c 100f 这样就可以得到摄氏中等价于华氏100度的气温了。