不求甚解

此博客为个人学习之用,如与其他作品雷同,纯属巧合。

导航

shell 变量的运算、保存硬件信息脚本

Posted on 2021-04-01 12:06  三年三班王小朋  阅读(87)  评论(0编辑  收藏  举报

变量的数学运算

方法一:expr

##加减乘除

[root@localhost ~]# num1=10
[root@localhost ~]# num2=16
[root@localhost ~]# expr $num1 + $num2
26
[root@localhost ~]# num3=`expr $num1 \* num2`
[root@localhost ~]# echo $num3
160
[root@localhost ~]# num3=$(expr $num1 / $num2) 
[root@localhost ~]# echo $num3
0         #默认不显示小数,取整

注意:

  1. 请用空格隔开每个项。
  2. 请将反斜杠(\)放在 Shell 特殊字符前面 如\* 。
  3. 请对包含空格和其他特殊字符的字符串用引号括起来。
  4. $()命令替换与``(反引号)都是用来作命令替换的。

方法二:$(())

$符号加(())

[root@localhost ~]# num1=10
[root@localhost ~]# num2=16
[root@localhost ~]# echo $((num1+num2)) #加
26
[root@localhost ~]# echo $(($num1-$num2)) #减变量加$也可以
-6
[root@localhost ~]# echo $((num3=num1*num2)) #乘
160
[root@localhost ~]# ((num4=num2/num1))
[root@localhost ~]echo $num4
0        #除,默认取整数,不显示小数

注意:这种写法(( ))内使用变量时可以不用加$前缀,(( )) 会自动解析变量名。

方法三:$[]

$符号加[]

[root@localhost ~]# num1=10
[root@localhost ~]# num2=16
[root@localhost ~]# echo $[num1 + num2] #加
26
[root@localhost ~]# echo $[num1 - num2] #减
-6
[root@localhost ~]# echo $[num1 * num2] #乘
160
[root@localhost ~]# echo $[num2 / num1] #除,同上
1

方法四:let

let不直接输出

[root@localhost ~]# num1=10
[root@localhost ~]# num2=16
[root@localhost ~]# let sum=$num1+$num2;echo $sum #加
26
[root@localhost ~]# let sum=$num1-$num2;echo $sum #减
-6
[root@localhost ~]# let sum=$num1*$num2;echo $sum #乘
160
[root@localhost ~]# let sum=$num2/$num1;echo $sum #除
1

扩展:小数运算bc

scale=n;定义小数精度,此外可以直接运行bc命令进行输入计算

[root@localhost ~]# num1=1.8
[root@localhost ~]# num2=2.2
[root@localhost ~]# echo "scale=3;$num1+$num2" | bc
4.0
[root@localhost ~]# echo "scale=2;$num2-$num1" | bc
.4
[root@localhost ~]# echo "scale=2;$num2*$num1" | bc
3.96
[root@localhost ~]# num3=`echo "scale=2;$num2/$num1" | bc`
[root@localhost ~]# echo $num3
1.22

扩展:小数运算awk

awk -v 带入外部变量,'{ print num1 + num2 }'即可

[root@localhost project]# num1=2.1
[root@localhost project]# num2=1.5
[root@localhost project]# echo | awk -v num1=$num1 -v num2=$num2 "{print num1 + num2 }"
3.6
[root@localhost project]# echo | awk -v num1=$num1 -v num2=$num2 "{print num1 - num2 }"
0.6
[root@localhost project]# echo | awk -v num1=$num1 -v num2=$num2 "{print num1 * num2 }"
3.15
[root@localhost project]# echo | awk -v num1=$num1 -v num2=$num2 "{print num1 / num2 }"
1.4

实例练习:保存硬件信息脚本1.csv

#!/bin/bash
#auther by wxp
IP_ADDRESS=`ifconfig ens32|grep netmask|tr -s " " :|cut -d: -f3`
CPU_MODEL=`cat /proc/cpuinfo|grep "model name"|cut -d: -f2`
CPU_CORES=`cat /proc/cpuinfo|grep "cpu cores"|cut -d: -f2`
MEM_TOTLE=`expr $(cat /proc/meminfo|grep "MemTotal"|tr -s " " :|cut -d: -f2) / 1024 `
MEM_FREE=`expr $(cat /proc/meminfo|grep "MemFree"|tr -s " " :|cut -d: -f2) / 1024`
MEM_USEAGE=`echo "scale=2;$MEM_FREE*100/$MEM_TOTLE"|bc`
DISK_TOTAL=`fdisk -l|grep "/dev/sda:"|cut -d' ' -f2|cut -d: -f2`
LOAD_INFO=`uptime|awk '{print $(NF)}'`

echo -e "\033[32m----------------------Device Info---------------------\033[0m"
echo -e "\033[33mIP地址:$IP_ADDRESS\033[0m"
echo -e "\033[33mcpu型号:$CPU_MODEL"
echo -e "\033[33mcpu核心数:$CPU_CORES\033[0m"
echo -e "\033[33m内存大小:$MEM_TOTLE M"
echo -e "\033[33m内存空闲:$MEM_FREE M"
echo -e "\033[33m内存使用率:$MEM_USEAGE %\033[0m"
echo -e "\033[33m磁盘总空间:$DISK_TOTAL GB\033[0m"
echo -e "\033[33m负载:$LOAD_INFO\033[0m"
echo -e "\033[32m--------------------------Over-------------------------\033[0m"
#save
echo "do you want to sava it?"
read -p "1)yes, 2)no, :" yes_no
case $yes_no in
        1) echo "you choose yes!save it to 1.csv" 
        echo "IP地址,cpu型号,cpu核心数,内存大小,内存剩余,内存使用率,硬盘大小,15分钟负载" >> 1.csv
        echo "IP_ADDRESS:${IP_ADDRESS},CPU_MODEL:${CPU_MODEL},CPU_CORES:${CPU_CORES},MEM_TOTLE:${MEM_TOTLE},\
        MEM_FREE:${MEM_FREE},MEM_USEAGE:${MEM_USEAGE},DISK_TOTAL:${DISK_TOTAL},LOAD_INFO:${LOAD_INFO}" >> 1.csv
;;

        2) echo "you choose no!" exit;;
        *) echo "Illegal input!";;
esac