第四章 变量的运算
第四章 变量的运算
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 $alet a=10*10 echo $alet a=10/10 echo $alet 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 "==" || "><" 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 出门在外要保护好自己 fiif [ 你是女孩子 ] 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 firead -p "请输入要计算的第二个数字: " num2 if [ ! -z $(echo ${num2}|sed -r 's#[0-9]+##g') ];then echo "请输入整数" exit fiecho -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 ];thenecho "$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 elseread -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 fifi
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