记录shell编程内 对是否为数字的判断 以及 小数的计算 的问题解决方案
记录一下今天做的linux大作业其中的一个作业
题目要求:编写shell脚本,实现两个变量之间的加减乘除运算
注:以下代码为shell脚本内的代码
1 #! /bin/bash 2 echo "please enter first number:" 3 read number1; 4 if [ -z `echo "$number1" | sed 's/[0-9][0-9]*//g'` ] ;then #此处为判断输入的变量是否为数字,若是,则输入第二个变量 5 echo "please enter second number:" 6 read number2; 7 if [ -z `echo "$number2" | sed 's/[0-9][0-9]*//g'` ] ;then #与第四行同理 8 echo "number1+number2= $((number1+number2)) " 9 echo "number1-number2= $((number1-number2)) " 10 echo "number1*number2= $((number1*number2)) " 11 if [ $number2 -eq 0 ];then #进行一次判断,即除数不能为0 12 echo "number2=0,can't devide"; 13 else 14 num3=$(echo "scale=2;$number1/$number2"|bc) #考虑到除法会有小数的情况 这里借用bc进行浮点数运算,其中scale=2表示保留两位小数 15 echo "number1/number2 =$num3" 16 fi 17 else 18 echo "number2 is not a figure!"; 19 fi 20 else 21 echo "number1 is not a figure!"; 22 fi 23 exit 0
对脚本的简单讲解:
1.第四行
sed 's 表示对某些内容进行替换,具体的替换规则/[0-9][0-9]*//g需要拆开来看:
第一部分/[0-9][0-9]*表示即将被替换的内容,0-9表示数字,后面的星号表示占位符,即表示任意位数,第一部分的意思就是即将被替换的内容为数字
第二部分//g 表示替换的内容,和第一部分联合起来就是把所有数字替换为空( /g )
第四行的整体意思是把收到的变量中的所有数字全部替换为空,
若替换完以后变量变成了空,则表示原变量全部为数字,可以进行运算
若替换完以后变量不全为空,则表示原变量中存在非数字的部分,不可以进行运算,提示出错
2.第十四行
echo "scale=2;$number1/$number2"|bc 表示借助bc来计算number1除以number2 |表示将前一个命令的输出转化为后一个命令的输入,将echo的输出转化为bc工具的输入,即可实现计算
这个脚本并不是最终版本,明天的任务是把这个脚本进行函数化,即当第一个数字输入错误时可以重新进行输入
2020/5/29 10:49 第二次编辑
成功修改脚本,实现了对小数以及负数运算的支持,第一版无法识别小数和负数
1 #! /bin/bash 2 function number1() 3 { 4 read -p "please enter first number:" number1 5 if [ -z `echo "$number1" | sed 's/[0-9]*//g' | sed 's/.//' | sed 's/-//'` ] ;then 6 echo $number1 7 number2AndCal $number1 8 else 9 echo "number1 is not a figure!"; 10 number1 11 fi 12 } 13 function number2AndCal(){ 14 read -p "please enter second number:" number2 15 if [ -z `echo "$number2" | sed 's/[0-9][0-9]*//g' | sed 's/.//' | sed 's/-//'` ] ;then 16 echo "number1=:$1,number2=$number2;" 17 addNumber=$(echo "scale=2;$1+$number2"|bc); 18 echo "number1+number2= $addNumber" 19 minusNumber=$(echo "scale=2;$1-$number2"|bc); 20 echo "number1-number2= $minusNumber " 21 plusNumber=$(echo "scale=2;$1*$number2"|bc) 22 echo "number1*number2= $plusNumber" 23 if [ $(echo "$number2 == 0"|bc) -eq 1 ];then 24 echo "number2=0,can't devide"; 25 else 26 num3=$(echo "scale=2;$1/$number2"|bc) 27 echo "number1/number2 =$num3" 28 fi 29 else 30 echo "number2 is not a figure!"; 31 number2AndCal $1 32 fi 33 } 34 35 number1 36 exit 0
代码中使用了两个函数,意义是在于用户输错格式的时候可以进行重新输入
number1函数的作用是读取第一个数字,number2AndCal函数的作用是读取第二个数字并且进行加减乘除运算
代码第五行和第十四行的作用是将用户输入的第一个变量中的所有数字替换为空,再把第一个小数点替换为空,再把第一个负号替换为空,替换完成以后进行检测,
如果变量为空,则可以证明用户输入的是数字,可以运算
如果变量不为空,则代表用户输入中仍存在字符,这时不可进行运算,提示用户重新输入
同时,为了支持对小数及负数的运算以及变量是否等于0的正确结果,在代码中所有的计算均使用bc工具,并且保留两位小数
测试过程中选择了正整数运算,变量为0的运算,小数运算,负数运算,大数运算,输入非数字几种情况,结果均正确

浙公网安备 33010602011771号