第四章 变量的运算

第四章 变量的运算

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
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向 着 太 阳 出 发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值