shell变量运算
加、减、乘、除、取余
用途:例如模拟计算器
如何实现运算:
整数运算:expr、$(()) 、$[]
bash支持对整数四则运算,但是并不支持浮点运算
小数运算:bc、awk
expr 例:
$(()) 例:
$[] 例:
bc 例:
awk 例:
案例
案例1:根据系统时间,打印今年和明年的时间。
echo "今年是 $(date +%Y) 年"
echo "明年是 $(( $(date +%Y)+1)) 年"
案例2:根据系统时间,获取今年还剩下多少星期,已经过了多少星期
思路梳理:
1.今天是今年的第多少天。 date +%j
可以获得今天的是今年的第几天
2.通过已获取的天数 /7 是不是就能知道已经过了多少周。
3.通过 ( 365 - 已过的天数)/ 7 还有多少周到下一个新年。
echo $(date +%j)
echo "今年已经过去 $(( $(date +%j) /7 )) 个星期"
echo "今年还剩 $(( (365-$(date +%j)) /7 )) 个星期"
案例3:实现计算器的功能,允许传入2个值,对传入的值进行 加减 乘除。
思路梳理:
1.可以选择直接传递参数的方式。要能控制能传入的个数。
2.拿到传入的值之后,进行加减乘除。
#!/bin/bash
if [ $# -ne 2 ];then #如果总共传递的参数个数不等于2,就报错要求输入两个参数
echo "error 请输入两个参数"
exit
fi
echo "$1 + $2 = $(( $1 + $2 ))" #第1个shell脚本位置参数+第2个shell脚本位置参数,后面的以此类推
echo "$1 - $2 = $(( $1 - $2 ))"
echo "$1 * $2 = $(( $1 * $2 ))"
echo "$1 / $2 = $(( $1 / $2 ))"
echo "$1 % $2 = $(( $1 % $2 ))"
案例4:
使用Shell脚本打印,
系统版本、
内核版本平台、
虚拟平台、
静态主机名、
ens192网卡IP地址、
lo网卡IP地址、
当前主机的外网IP地址 curl icanhazip.com
思路梳理:
系统版本:cat /etc/redhat-release
内核版本平台: uname -r
虚拟平台:dmidecode -s system-product-name
、virt-what
静态主机名:hostnamectl |awk -F ':' '/Static hostname/ {print $2}'
ens192网卡IP地址 :ip add show ens192|awk '/inet/ {print $2}'|awk -F '/' 'NR==1{print $1}'
lo网卡IP地址 :ip add show lo|awk '/inet/ {print $2}'|awk -F '/' 'NR==1{print $1}'
打印当前主机的外网IP地址:
echo $(curl -s icanhazip.com)
#!/bin/bash
GREEN="echo -e \033[1;32m"
$GREEN------------------------System info----------------------------------
echo "系统版本:$(cat /etc/redhat-release)"
echo "内核版本平台: $(uname -r)"
echo "虚拟平台:$(virt-what)"
echo "静态主机名: $(hostnamectl |awk -F ':' '/Static hostname/ {print $2}')"
echo "ens192网卡IP地址: $(ip add show ens192|awk '/inet/ {print $2}'|awk -F '/' 'NR==1{print $1}')"
echo "lo网卡IP地址: $(ip add show lo|awk '/inet/ {print $2}'|awk -F '/' 'NR==1{print $1}')"
echo "当前主机的外网IP地址:$(curl -s icanhazip.com)"
$GREEN---------------------------------------------------------------------
脚本执行效果:
案例5:查看系统当前有几个登陆的用户
思路梳理:
使用w
命令查看当前用户登录的情况
再通过awk获取到想要输出的信息 (包含up的行,第6列,就是我们想要的信息)
#!/bin/bash
echo "系统当前有 $(w |awk '/up/ {print $6}') 个登录的用户"
案例6:筛选出当前系统存在的僵尸进程
僵尸进程是一个已经完成执行但仍在进程表中的进程。
僵尸进程的状态(STAT)为Z
ps -A -o stat,ppid,pid,cmd |grep -e '^[Zz]'|wc -l
-A #展示所有进程
-o #自定义输出项目
stat #是类型
ppid 是进程的父进程号
pid 进程号
cmd 进程名
案例7:查看当前系统已使用内存的百分比
#!/bin/bash
mem=$(free -m |awk '/Mem/{print $3/$2*100}')
echo "当前系统已使用内存:${mem%.*} %"
执行结果
案例8:查看当前系统已使用磁盘的百分比
匹配以/
结尾的内容,然后输出第五列
df -h |awk '/\/$/ {print $5}'
或
匹配以/
结尾的内容,然后输出第倒数第二列
df -h |awk '/\/$/ {print $(NF-1)}'
输出的内容都一样
#!/bin/bash
echo "当前系统已使用磁盘 $(df -h |awk '/\/$/ {print $(NF-1)}') "
案例9:查看当前系统已使用CPU的百分比
思路梳理:
使用top命令查看cpu空闲百分比(id)。
top -n1限制迭代次数,就是让top只输出一次
100-空闲百分比=已使用百分比
#!/bin/bash
echo "当前系统已使用CPU $(top -n1|awk 'NR==3{print 100-$8}') %"
#打印top输出内容的第三行,再用100减去第八列后的结果
执行结果
Shell变量总结
1.什么是变量
2.变量的规范(命名、格式)
3.定义变量的方式
1.自定义,自行定义
2.系统的环境变量,可直接使用,任何用户都行。
3.预定义变量,Shell内置的方法。直接使用
4.调用变量 $var ${var}
5.非交互式传递变量 read、类似于python中input
6.变量替换
7.变量运算