第四章 变量的运算
4.1 什么是变量运算
顾名思义,变量运算就是对变量的值进行运算,也就是 加 减 乘 除 取余
4.2 变量运算语法
expr #只能做整数运算
$(( )) #双括号运算,只支持整数运算,效率高
$[] #整数运算,最简洁
bc,awk #支持小数点
% #取余
4.3 举例
expr
expr 10 + 10
expr 10 - 10
expr 10 \* 10
expr 10 / 10
num1=10
num2=20
expr ${num1} + ${num2}
$(( ))
echo $((10+10))
echo $((10-10))
echo $((10*10))
echo $((10/10))
echo $((10+10-5))
echo $((10+10-5*6))
num1=10
num2=20
echo $(($num1*$num2))
$[ ]
echo $[10+10]
echo $[10+10*20]
echo $[10+10*20-1000]
echo $[10+10*20/1000]
let
let a=10+10
echo $a
let a=10*10
echo $a
let a=10/10
echo $a
let a=$num1+$num2
echo $a
bc
echo 10*10|bc
echo 10*10.5|bc
echo 10-5.5|bc
echo 10/5.5|bc
awk运算
awk 'BEGIN{print 10+10}' awk 'BEGIN{print 10-10}' awk 'BEGIN{print 10*10}' awk 'BEGIN{print 10/10}' awk 'BEGIN{print 10^10}' awk 'BEGIN{print 10-4.5}' awk 'BEGIN{print 10*4.5}' awk 'BEGIN{print 10/4.5}'
4.4 练习题
练习题1: 根据系统时间打印出今年和明年时间
[root@m-61 ~]# echo "this year is $(date +%Y)" this year is 2020
[root@m-61 ~]# echo "this year is $(( $(date +%Y) + 1 ))"
this year is 2021
[root@m-61 ~]# echo $[ `date +%Y` + 1 ]
2022
练习题2: 根据系统时间获取今年还剩下多少星期,已经过了多少星期
[root@m-61 ~]# date +%j
214
[root@m-61 ~]# date +%U
30
[root@m-61 ~]# echo "今年已经过了 $(date +%j) days"
今年已经过了 214 days
[root@m-61 ~]# echo "今年还剩 $[ ( 365 - $(date +%j) ) / 7 ] 周"
今年还剩 21 周
[root@m-61 ~]# echo "今年还剩 $[ ( (365 / 7) - $(date +%U)) ] 周"
今年还剩 22 周
练习题3: 完成简单计算功能,通过read方式传入2个值,进行加减乘除
[root@m-61 ~]# cat vars-2.sh
#!/bin/bash
read -p "please input num1:" num1
read -p "please input num2:" num2
echo "$num1 + $num2 =" $[ $num1 + $num2 ]
echo "$num1 - $num2 =" $[ $num1 - $num2 ]
echo "$num1 * $num2 =" $[ $num1 * $num2 ]
echo "$num1 / $num2 =" $[ $num1 / $num2 ]
作业
概念解释:
1.简单介绍shell脚本是什么,使用场景有哪些?
2.shell脚本的书写规范是什么?
3.shell脚本变量的定义方式有几种?
4.shell脚本如何引用变量?
5.shell脚本特殊变量的意思是什么?$0 $1 $2 $* $@ $# $$ $? 6.变量的运算方式
练习题:
1.使用Shell脚本打印,系统版本、内核版本平台、主机名、eth0网卡IP地址、lo网卡IP地址、当前 主机的外网IP地址,提醒:curl icanhazip.com
2.编写一个精简的脚本实现一个计算器
3.查看当前内存使用的百分比和系统已使用磁盘的百分比
第五章 条件判断
5.1 基于文件进行判断
参数说明
参数 | 说明 | 举例 |
---|---|---|
-e | 如果文件或目录存在则为真-常用 | [ -e file ] |
-s | 如果文件存在且至少有一个字符则为真 | [ -s file ] |
-d | 如果文件存在且为目录则为真-常用 | [ -d file ] |
-f | 如果文件存在且为普通文件则为真-常用 | [ -s file ] |
-r | 如果文件存在且可读则为真 | [ -r file ] |
-w | 如果文件存在且可写则为真 | [ -w file ] |
-x | 如果文件存在且可执行则为真 | [ -x file ] |
5.2 语法
第一种写法
test -f /etc/passwd && echo "true" || echo "false"
第二种写法
[ -f /etc/passwdd ] && echo "true" || echo "false"
练习
[ -f /etc/passwd ] && echo "文件存在" || echo "文件不存在"
[ -e /etc/passwd ] && echo "文件存在" || echo "文件不存在"
[ -r /etc/passwd ] && echo "文件可读" || echo "文件不可读"
[ -w /etc/passwd ] && echo "文件可写" || echo "文件不可写"
[ -x /etc/passwd ] && echo "文件可执行" || echo "文件不可执行"
[ -s /dev/zero ] && echo "true"||echo "false"
[ -s /dev/null ] && echo "true"||echo "false"
[ -s /etc/passwd ] && echo "true"||echo "false"
[ -f /dev/zero ] && echo "true"||echo "false"
[ -f /dev/null ] && echo "true"||echo "false"
[ -f /etc/passwd ] && echo "true"||echo "false"
5.3 基于整数进行判断
参数说明
参数 | 说明 | 举例 |
---|---|---|
-eq | 等于则条件为真 equal | [ 1 -eq 10 ] |
-ne | 不等于则条件为整 not equal | [ 1 -ne 10 ] |
-gt | 大于则条件为真 greater than | [ 1 -gt 10 ] |
-lt | 小于则条件为真 less than | [ 1 -lt 10 ] |
-ge | 大于等于则条件为真 greater equal | [ 1 -ge 10 ] |
-le | 小于等于则条件为真 less equal | [ 1 -le 10 ] |
举例
单个条件
#!/bin/bash
read -p "please input num1:" num1
read -p "please input num2:" num2
[ $num1 -eq $num2 ] && echo "-eq ok" || echo "-eq no"
[ $num1 -ne $num2 ] && echo "-ne ok" || echo "-ne no"
[ $num1 -gt $num2 ] && echo "-gt ok" || echo "-gt no"
[ $num1 -lt $num2 ] && echo "-lt ok" || echo "-lt no"
[ $num1 -ge $num2 ] && echo "-ge ok" || echo "-ge no"
[ $num1 -le $num2 ] && echo "-le ok" || echo "-le no"
综合练习题
1.判断用户输入的是否为整数
2.判断用户输入的是否为包含特殊字符
3.判断用户输入的参数是否满足2个
4.判断用户输入的数字是否不超过4位
5.编写加判断的计算器
5.3 基于字符串进行判断
参数说明
参数 | 说明 | 举例 |
---|---|---|
== | 等于则条件为真 | [ “ a " = = " a" == " a"=="b” ] |
!= | 不等于则条件为真 | [ “ a " ! = " a" != " a"!="b” ] |
-z | 字符串内容为空则为真 | [ -z “$a” ] |
-n | 字符串内容不为空则为真 | [ -n “$a” ] |
举例
[ 10 == 10 ] && echo "==" || "><"
[ 10 != 5 ] && echo "==" || "><"
name=123
[ -z "$name" ] && echo "true"||echo "false"
[ -n "$name" ] && echo "true"||echo "false"
5.4 多个条件的判断
参数说明
参数 | 说明 | 举例 |
---|---|---|
-a | 左右两边的条件同时为真才为真 | [ 1 -eq 1 -a 2 -gt 1 ] |
-o | 左右两边的条件有一个为假则为假 | [ 1 -eq 1 -o 2 -gt 2 ] |
举例
[ 1 -eq 1 -a 2 -gt 1 ] && action OK /bin/true || action NO /bin/false
[ 1 -eq 1 -o 2 -gt 2 ] && action OK /bin/true || action NO /bin/false 12
第六章 shell流程控制之if
6.1 if单分支
伪代码:
if [ 你是男孩子 ];then
出门在外要保护好自己
fi
if [ 你是女孩子 ]
then
无论什么时候都不要相信男人说的话
fi
举例:
[root@m-61 ~/scripts]# cat if-1.sh
#!/bin/bash
if [ "$1" -eq "$2" ]
then
echo "ok"
fi
[root@m-61 ~/scripts]# bash if-1.sh 2 2
ok
[root@m-61 ~/scripts]# bash if-1.sh 2 4
[root@m-61 ~/scripts]#
6.2 双条件分支
伪代码:
if [ 你是男孩子 ]
then
出门在外要保护好自己
else
不要相信男人说的话
fi
举例:
if [ "$1" -eq "$2" ]
then
echo "ok"
else
echo "error"
fi
6.3 多条件分支
if [ 你是男孩子 ];then
出门在外要保护好自己
elif [ 你是女孩子 ];then
不要相信男人说的话
else
你是吃什么长大的
fi
举例:
#!/bin/bash
if [ $1 -eq $2 ];then
echo "=="
elif [ $1 -gt $2 ];then
echo ">"
else
echo "= or >"
fi
6.4 练习题
6.4.1 简单的计算器脚本
#!/bin/bash
#read -p "请输入:" memu
num1=$1
num2=$2
int=$(echo ${num1}${num2}|sed -r 's#[0-9]+##g')
if [ $# -ne 2 ];then
echo "请输入2个参数"
exit
elif [ -z ${int} ];then
echo "${num1} + ${num2} = $[ ${num1} + ${num2} ]"
echo "${num1} - ${num2} = $[ ${num1} - ${num2} ]"
echo "${num1} * ${num2} = $[ ${num1} * ${num2} ]"
echo "${num1} / ${num2} = $[ ${num1} / ${num2} ]"
else
echo "请输入2个整数"
fi
6.4.2 使用IF选择的计算器
需求:
1.使用rede读取用户输入的数字和符号
2.符号使用菜单供用户选择
3.符号使用if作为判断
菜单如下:
请输入第一个数字:10
请输入第二个数字:20
请选择运算符号: 1. + 2. - 3. * 4. /
请输入您的选择:1
显示结果: 10 + 20 = 30
脚本:
#!/bin/bash
read -p "请输入要计算的第一个数字: " num1
read -p "请输入要计算的第二个数字: " num2
echo -e "请选择运算符号: 1. + 2. - 3. * 4. /"
read -p "请输入您的选择: " fuhao
if [ $fuhao == 1 ];then
echo "$num1 + $num2 = $(( $num1 + $num2 ))"
elif [ $fuhao == 2 ];then
echo "$num1 - $num2 = $(( $num1 - $num2 ))"
elif [ $fuhao == 3 ];then
echo "$num1 * $num2 = $(( $num1 * $num2 ))"
elif [ $fuhao == 4 ];then
echo "$num1 / $num2 = $(( $num1 / $num2 ))"
else
echo "请输入1-4"
fi
加入输错判断的脚本:
#!/bin/bash
read -p "请输入要计算的第一个数字: " num1
if [ ! -z $(echo ${num1}|sed -r 's#[0-9]+##g') ];then
echo "请输入整数"
exit
fi
read -p "请输入要计算的第二个数字: " num2
if [ ! -z $(echo ${num2}|sed -r 's#[0-9]+##g') ];then
echo "请输入整数"
exit
fi
echo -e "请选择运算符号: 1. + 2. - 3. * 4. /"
read -p "请输入您的选择: " fuhao
if [ $fuhao == 1 ];then
echo "$num1 + $num2 = $(( $num1 + $num2 ))"
elif [ $fuhao == 2 ];then
echo "$num1 - $num2 = $(( $num1 - $num2 ))"
elif [ $fuhao == 3 ];then
echo "$num1 * $num2 = $(( $num1 * $num2 ))"
elif [ $fuhao == 4 ];then
echo "$num1 / $num2 = $(( $num1 / $num2 ))"
else
echo "请输入1-4" fi
6.4.3 备份文件,如果目录不存在就自动创建
#!/bin/bash
if [ -e /backup/ ];then
echo "目录已经存在"
else
mkdir /backup/ -p
6.4.4 用户执行脚本,传递一个参数作为服务名,检查服务状态
#!/bin/bash
if [ $# -eq 1 ];then
#检查服务的状态
systemctl status $1 &>/dev/null
#判断服务运行的结果
if [ $? -eq 0 ];then
echo "$1 服务正在运行"
else
echo "$1 服务没有运行"
fi
else
echo "USAGE: sh $0 service_name"
exit
fi
6.4.5 查看磁盘当前使用状态,如果使用率超过30%则报警发邮件
分析:
1.查看磁盘分区的状态命令是什么?
2.提取/分区的状态百分比命令是什么?
3.将提取出来的状态百分比和我们设置的阈值进行对比,超过30%报警,不超过就不处理
4.将处理结果写入到文件里
脚本:
#!/bin/bash
#1.提取磁盘使用的百分比
Disk_Status=$(df -h | grep '/$' |awk '{print $5}'|sed 's#%##g')
Time=$(date +%F-%T)
#2.判断磁盘使用百分比是否超过30,如果超过,则写入一个文件中。
if [ ${Disk_Status} -ge 30 ];then
echo "${USER}:${Time}: Disk Is Use ${Disk_Status}" >> /tmp/disk_use.txt
fi
6.4.6 成绩查询
提醒用户输入自己的成绩
1.如果分数大于0小于59则提示需要补考
2.如果分数大于60小于85则提示成绩良好
3.如果分数大于86小于100提示成绩优秀
脚本:
#!/bin/bash
read -p "来查成绩吧:" score
if [ ${score} -ge 0 ] && [ ${score} -le 59 ];then
echo "补考吧兄弟"
elif [ ${score} -ge 59 ] && [ ${score} -le 85 ];then
echo "这次饶你一命"
elif [ ${score} -ge 86 ] && [ ${score} -le 100 ];then
echo "这么厉害,你是吃什么长大的"
else
echo "查询范围是0-100哦"
exit
fi
思考:这个脚本存在的缺陷
1.如果用户输入了多个参数或者没有输入参数呢
2.如果用户输入的不是说字而是字符串呢
完善之后的脚本:
#!/bin/bash
if [ $# != 0 ];then
echo "请不要带参数查询"
exit
else
read -p "来查成绩吧:" score
if_num=$(echo "${score}"|sed -r 's#[0-9]+##g')
if [ -n "${if_num}" ];then
echo "请输入整数"
exit
elif [ ${score} -ge 0 ] && [ ${score} -le 59 ];then
echo "补考吧兄弟"
elif [ ${score} -ge 59 ] && [ ${score} -le 85 ];then
echo "这次饶你一命"
elif [ ${score} -ge 86 ] && [ ${score} -le 100 ];then
echo "这么厉害,你是吃什么长大的"
else
echo "查询范围是0-100哦"
exit
fi
fi
6.4.7 判断输入的数字是否为整数方法
#!/bin/bash
input=$1
#第一种方法
expr ${input} + 1 > /dev/null 2>&1
if [ $? != 0 ];then
echo "请输入整数"
fi
#第二种方法
num=$(echo ${input}|sed -r 's#^[0-9]+##g')
if [ -n "${num}" ];then
echo "请输入整数"
fi
#第三种方法
if [[ ! "${input}" =~ ^[0-9]+$ ]];then
echo "请输入纯数字"
fi