> 文档中心 > 第四章 变量的运算

第四章 变量的运算


第四章 变量的运算

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