shell脚本【三】

修改网卡信息

[root@lsy script]# cat eth0.sh 
#!/biin/bash
#xxx 20200402
#修改网卡IP地址
read -p "请输入eth0的IP地址" IP
cp /etc/sysconfig/network-scripts/ifcfg-eth0 /tmp/ifcfg-eth0.bak
ls -l /tmp/ifcfg-eth0.bak >>/dev/null  2>&1
[ $? -eq 0 ]  && echo "备份成功"
sed -ri "/IPADDR/s#(IPADDR=).*#\1$IP#g" /etc/sysconfig/network-scripts/ifcfg-eth0
systemctl restart network
ping -c 1 -W 1 223.5.5.5 >>/dev/null  2>&1
[ $? -eq 0 ] && echo "网络修改成功" ||  echo "网络有些问题"

[root@lsy script]# 

遇到的问题:
①不能在脚本里面使用别名以及ll 类似的缩写 ls -l
②sed命令的后项引用前项的信息,不是括号里面的,是括号外面的
③[ 空格 $? -eq 数值 空格 ] 不可以定格写,会报错
④ >> /dev/nunll 2>&1 进入黑洞,正确和错误的一起都进入黑洞

修改主机名

[root@lsy script]# cat anli01.sh 
#!/bin/bash
#xxx 20200401 
#修改主机名
read -p "请输入一个主机名:" name  
if  [ -z  $name ] 
then  
    echo "请按照提示操作"
else 
hostnamectl set-hostname $name
bash
fi

测试域名是否可用

[root@lsy script]# cat anli02.sh 
#!/bin/bash
#xxx 20200402
#测试域名是否可用
read -p "请输入一个域名地址:" dname
if [ -z $dname ]
then
 echo  "请按照提示操作"
else
ping  -c 2 $dname >/dev/null 2>1
[ $? -eq 0 ] && echo "this web_name $dname is ok." >/tmp/test_ping.txt ||echo "this is web_name $dname is error" >/tmp/test_ping.txt
fi
[root@lsy script]# 

正规解法

编写修改主机名和IP地址脚本
编写测试域名访问脚本

[root@web01 script]# cat homenetwork.sh 
#!/bin/bash
        # xxxx
        
        New_Hostname="$1"
        New_Ip="$2"
        Network_Config="/etc/sysconfig/network-scripts/ifcfg-eth0"
        
        [ $# -ne 2 ] && {
              echo "Usage: $0 {请写出修改主机名称和IP地址信息.}" 
              exit
        }
        
        # 修改主机名称
        hostnamectl set-hostname "$New_Hostname"
        [ $? -eq 0 ] && echo  "主机名称修改完毕" || echo "主机名称修改失败"
        
        # 修改网卡地址
        cp $Network_Config  /tmp/
        [ -f /tmp/ifcfg-eth0  ] || {
                echo "网卡配置文件备份失败,无法修改地址信息"
                exit
        }  
        sed -ri "/IPADDR/s#(IPADDR=).*#\1${New_Ip}#g" $Network_Config
        grep "$New_IP" $Network_Config &>/dev/null
        [ $? -eq 0 ] && echo "主机地址修改完毕" || echo "主机地址修改失败" 
        
        read -p "确认是否重启网络(yes|no): " ans
        [ "$ans" == "yes" ] && systemctl restart network  
[root@web01 script]# 

3)变量算法或者变量对比方法
1)变量算法相关符号信息
运算符号表信息
运算命令信息

运算符号表信息

± 加法 减法
*/% 乘法 除法 取余
** 幂运算
++ – 自增运算 自减运算
! && || 逻辑非 逻辑与 逻辑或
< <= > >= 大于 小于等于 大于等于
== != = 相等 不等 一个等号也可以表示等于
<<>> 向左移动 向右移动
= += -= *=/=%=

在这里插入图片描述

运算命令信息

应用2):识别变量信息做运算

[root@lsy script]# a=10
[root@lsy script]# echo $((a+1))
11
[root@lsy script]# echo $((a*2))
20

应用3):用于数值比较判断

在这里插入图片描述
用于区别 $?

[root@lsy script]# echo $((8=8))
-bash: 8=8: attempted assignment to non-variable (error token is "=8")
[root@lsy script]# echo $((8==8))
1
[root@lsy script]# echo $((7==8))
0
[root@lsy script]# echo $((7!=8))
1
[root@lsy script]# echo $((3<8 && 5==5))
1
[root@lsy script]# echo $((3>8 && 5==5))
0
[root@lsy script]# 

这里的返回值成立为1 不成立为0
注意区别:与$?的返回值的意义(0是成立;非0是不成立)

应用4)实现自增运算 自减运算
自增运算:
a

[root@lsy ~]# a=0
[root@lsy ~]# echo $((a=a+1))
1
[root@lsy ~]# echo $((a=a+1))
2
[root@lsy ~]# echo $((a=a+1))
3
[root@lsy ~]# echo $((a=a+1))
4
[root@lsy ~]# echo $a
4
[root@lsy ~]# 

自增运算的两种简写方式

[root@lsy ~]# a=0
[root@lsy ~]# echo $((a++))
0
[root@lsy ~]# echo $a
1
[root@lsy ~]# a=0
[root@lsy ~]# echo $((++a))
1
[root@lsy ~]# echo $a
1
[root@lsy ~]# 

a++:先进行运算,运算完不会马上进行赋值,重新调用时才显示赋值信息
++a:先进行运算,运算完将会马上进行赋值,直接显示运算结果

脚本案例:编写小脚本,可以实现2位数加减乘除运算

在这里插入图片描述
let —实现数值信息运算 重点关注
说明:只能调取变量信息做运算不支持直接运算,只能调用变量进行数值运算

[root@lsy script]# i=2
[root@lsy script]# let i=i+8
[root@lsy script]# 
[root@lsy script]# echo $i
10
[root@lsy script]# i=2
[root@lsy script]#  i=i+8
[root@lsy script]# echo $i
i+8
[root@lsy script]# 

企业案例:监控web页面状态信息,失败两次,表示网站出现问题需要进行报警。

正规解法

[root@lsy script]# cat HQ02.sh 
#!/bin/bash

    timeout=5
    fails=0
    success=0
    url=$1
    
    while true
    do
        wget --timeout=$timeout --tries=1 http://$url -q
        # 第一关: 判断访问失败或成功次数信息
        if [ $? -ne 0 ]
        then
           let fails=fails+1
        else
           let success++
        fi
        # 第二关: 成功情况如何打破循环
        if [ $success -eq 1 ]
        then
           echo "页面访问成功"
           exit
        fi
        # 第三关: 失败情况如何打破循环
        if [ $fails -eq 2 ]
        then
          echo "页面访问2次均失败"
          exit
        fi
    done

我的解法

[root@lsy script]# cat test03.sh
#!/bin/bash
#
read -p "请输入一个测试的域名" name
a=1
while [ $a -lt 4 ]
do
wget $name/index.html >>/dev/null 2>&1
if [ $? -eq 0 ]
then  echo "页面是可以访问的"
exit
fi
let a++
if [ $((a++)) -eq 4 ]
then
   echo "最后一次测试访问开始"
fi
done 
echo "这个域名是不可使用的"
[root@lsy script]# 

总结:
①test03.sh: line 4: [: 1+1: integer expression expected
test03.sh:第4行:[:1+1:需要整数表达式
不能使用式子,要使用结果
②exit的跳出循环 是 跳出整个大循环,不再执行脚本,不是从if跳出,进入while循环,而是跳出整个循环,得出结果,脚本不再执行

疑问:第一次循环后a的值应该为2,但是看sh -x的执行过程却是看到执行一次循环后a的值为3,
不知道为什么会出现这个情况

[root@lsy script]# sh -x test03.sh 
+ read -p 请输入一个测试的域名 name
请输入一个测试的域名123
+ a=1
+ '[' 1 -lt 4 ']'
+ wget 123/index.html
+ '[' 4 -eq 0 ']'
+ let a++
+ '[' 2 -eq 4 ']'
+ '[' 3 -lt 4 ']'
+ wget 123/index.html
+ '[' 4 -eq 0 ']'
+ let a++
+ '[' 4 -eq 4 ']'
+ echo 最后一次测试访问开始
最后一次测试访问开始
+ '[' 5 -lt 4 ']'
+ echo 这个域名是不可使用的
这个域名是不可使用的
[root@lsy script]# 

expr ----实现数值信息运算 重点关注

应用1)做数值信息的简单运算
expr 数值1 + 数值2 (中间有空格才行)

[root@lsy script]# expr 1 + 100
101

应用2)判断输出的式子是否为整数。

[root@lsy script]# i=1.5
[root@lsy script]# expr $i +6 
expr: syntax error
[root@lsy script]# echo $?
2
[root@lsy script]# 

得是整数才行

脚本案例:

[root@lsy script]# cat HQ03.sh
#!/bin/bash
read -p "请输入一个数" info
expr $info + 0 >/dev/null 2>&1
[ $? -eq 0 ] && echo 输入的是整数信息 || echo 输入的是非整数信息
[root@lsy script]#

在这里插入图片描述

上午总结:
①运算符号
在这里插入图片描述
②运算命令

expr的应用3)统计字符长度
[root@lsy script]# oldboy=“i am oldboy teacher”
[root@lsy script]# expr length “$oldboy”
19

expr的应用4)匹配到了几位数字
[root@lsy script]# expr match “10” “[0-9].*KaTeX parse error: Expected 'EOF', got '#' at position 29: …oot@lsy script]#̲ expr match "10…” 方式二 不带点可也可以
3
[root@lsy script]#

当然,这是扩展问题。
我的脚本有点问题

[root@lsy script]# cat test04.sh 
#!/bin/bash
#
read -p "输入一个参数" a
if [[`expr match "$a" "[0-9]*$"`]]
then
  echo "$a is not int"
else 
  echo "$a is int"
fi

unary operator expected
binary operator expected

expr的应用5)匹配验证文件扩展名

[root@lsy script]# cat test05.sh
#!/bin/bash
if expr "$1" : ".*\.jpg" >>/dev/null 2>&1
  then
    echo  "这个传参文件是一个图片文件"
  else
    echo  "这个传参文件不是一个图片文件"
fi

expr不能识别小数运算

bc —实现数值信息运算 了解

[root@lsy script]# echo  8+5 |bc
13

可以实现小数运算

[root@lsy script]# echo 1.2+1.4 |bc
2.6

ssh-copy-id —本地的ssh公钥文件安装到远程主机对应的账户下

如何利用脚本计算1+2+3+…+10总和数值
多种方法

awk 'BEGIN{for (i=1; i<=10; i++) a=a+i; print a}'
[root@lsy script]# seq  -s + 10
1+2+3+4+5+6+7+8+9+10
[root@lsy script]# seq  -s + 10|bc
55
[root@lsy script]# 
#!/bin/bash
a=0
for i in {1..10}
do
let a=a+i
let i=i+1
done
echo $a
[root@lsy script]# echo {1..10}|tr " " "+"|bc
55

seq命令

[root@lsy script]# seq 10
1
2
3
4
5
6
7
8
9
10

awk方式运算
BEGIN模式下使用

awk ‘BEGIN{print 5*10-3+6}’

[root@lsy script]# awk 'BEGIN{print 5*10-3+6 }'
53

方法二:利用awk的根据列进行运算

declare 或者 $[] — 实现

[root@lsy script]# a=5; declare -i a=a+10;echo $a
15
[root@lsy script]# 
[root@lsy script]# i=5
[root@lsy script]# i=$[i+6]
[root@lsy script]# echo $i
11

思考题:
复杂脚本问题

01.根据传参的数值生成杨辉三角形
传参为2
*

杨辉三角形

在这里插入图片描述

04.条件表达式编写方式
说明:为了使脚本执行更加合理。定义一些条件
1.条件表达式的书写方式
方式一:test <测试表达式>
说明:利用test 进行表达式书写进而判断条件信息
规范:test命令和"<测试表达式>" 之间至少有一个空格

在这里插入图片描述
方式二:[ <测试表达式> ] 推荐
说明:中括号 进行判断表达式书写进行判断条件信息
规范:【】边界和内容之间至少有一个空格

方式三:【 【 <测试表达式>】 】
说明:利用双中括号 进行表达式书写进行判断条件信息
规范:[[]]的边界和内容之间至少有一个空格

方式四:((<测试表达式>))
说明:利用双小括号 进行表达式书写进行判断条件信息
(()) 双小括号两端不需要有空格

方式一:test <测试表达式>
应用1:判断指定一个文件信息是否存在

[root@lsy script]# mkdir /oldboy
mkdir: cannot create directory ‘/oldboy’: File exists
[root@lsy script]# touch  /oldboy/oldboy.txt
[root@lsy script]# test -f /oldboy/oldboy.txt && echo file_name || echo file_name is not
file_name
[root@lsy script]# 

应用02:判断指定一个字符串长度是否为0

[root@lsy script]# oldboy="linux69"
[root@lsy script]# echo ${#oldboy}
7
[root@lsy script]# test -z "$oldboy"
[root@lsy script]# test -z "$oldboy" && echo 字符串长度为0 || echo 字符串
长度为$oldboy
字符串长度为linux69
[root@lsy script]# test -z "$oldboy" && echo 字符串长度为0 || echo 字符串长度为${#oldboy}
字符串长度为7
[root@lsy script]# 

-z 参数:判定字符串是否为 0 ?若 string 为空字符串,则为 true
-z 只能识别是0还是非0

补充总结:条件表达式 书写方式
利用各种参数进行判断
-d 文件存在且为目录则为真
-f 文件存在且为普通文件则为真

在这里插入图片描述

· [ <测试表达式> ] 推荐
说明: 利用中括号 进行表达式书写进行判断条件信息
规范: []的边界和内容之间至少有一个空格

应用01: 判断指定一个文件信息是否存在

  [root@web01 scripts 16:36:47]# [ -f /oldboy/oldboy.txt ] && echo 文件已经存在 || echo 文件不存在
      文件已经存在
      [root@web01 scripts 16:37:34]# [ -f /oldboy/oldgirl.txt ] && echo 文件已经存在 || echo 文件不存在
      文件不存在

应用02: 判断文件属性信息
判断读权限

 [oldboy@web01 ~ 16:41:11]$ [ -r /oldboy/oldboy.txt ] && echo 此文件已有读权限 || echo 此文件未设置读权限
      此文件未设置读权限
      [oldboy@web01 ~ 16:44:39]$ [ -r /oldboy/oldboy.txt ] && echo 此文件已有读权限 || echo 此文件未设置读权限
      此文件已有读权限

判断写权限

 [oldboy@web01 ~ 16:41:26]$ [ -w /oldboy/oldboy.txt ] && echo 此文件已有写权限 || echo 此文件未设置写权限
      此文件未设置写权限
      [oldboy@web01 ~ 16:45:53]$ [ -w /oldboy/oldboy.txt ] && echo 此文件已有读权限 || echo 此文件未设置读权限
      此文件已有读权限

判断执行权限

[oldboy@web01 ~ 16:41:50]$ [ -x /oldboy/oldboy.txt ] && echo 此文件已有执行权限 || echo 此文件未设置执行权限
此文件未设置执行权限
[oldboy@web01 ~ 16:46:01]$ [ -x /oldboy/oldboy.txt ] && echo 此文件已有读权限 || echo 此文件未设置读权限
此文件已有读权限

· [[ <测试表达式> ]]
说明: 利用双中括号 进行表达式书写进行判断条件信息
规范: [[]]的边界和内容之间至少有一个空格

应用01:

  [oldboy@web01 ~ 16:46:07]$ [[ -f /oldboy/oldboy.txt ]] && echo 文件已经存在 || echo 文件不存在
      文件已经存在
      [oldboy@web01 ~ 16:48:09]$ [[ -f /oldboy/oldgirl.txt ]] && echo 文件已经存在 || echo 文件不存在
      文件不存在

· ((<测试表达式>))
说明: 利用双小括号 进行表达式书写进行判断条件信息
(())(双小括号)两端不需要有空格

2.条件表达式识别变量信息

[root@lsy script]# unset file
[root@lsy script]# echo $file

[root@lsy script]# [ -f $file ] && echo 真 ||echo 假
真
[root@lsy script]# [ -f "$file" ] && echo 真 ||echo 假
假
[root@lsy script]# 

总结:只要条件表达式中需要识别加载变量,就直接加上双引号识别

条件表达式识别变量信息

[oldboy@web01 ~ 16:51:57]$ file=/oldboy/oldboy.txt 文件存在
[oldboy@web01 ~ 16:54:57]$ [ -f "KaTeX parse error: Expected 'EOF', got '&' at position 9: file" ] &̲& echo "1(真)" |… file=/oldboy/oldgirl.txt 文件不存在
[oldboy@web01 ~ 16:55:23]$ [ -f “$file” ] && echo “1(真)” || echo “0(假)”
0(假)

[oldboy@web01 ~ 16:57:56]$ echo f i l e [ o l d b o y @ w e b 01   16 : 58 : 00 ] file [oldboy@web01 ~ 16:58:00] [ -f KaTeX parse error: Expected 'EOF', got '&' at position 8: file ] &̲& echo "1(真)" |… [ -f “$file” ] && echo “1(真)” || echo “0(假)”
0(假)

总结: 只要条件表达式中需要识别加载变量, 就直接加上双引号识别

3.特殊条件表达式书写方式

应用01:判断目录是否存在 如果存在提示目录已经存在 并在目录中创建oldboy.txt
在这里插入图片描述

[root@lsy script]# cat test07.sh 
#!/bin/bash
dir_info="/oldboy"
[ -d "$dir_info" ] && {
echo 此目录已经创建
cd /oldboy
touch oldboy.txt
}
[root@lsy script]# 

4.字符串测试表达式
测试判断字符串信息方法
参考表格信息

应用01:检查字符串信息是否非空

[root@lsy script]# [ -n "$oldboy" ] && echo 真 ||echo 假
真
[root@lsy script]# [ -n "$oldboy" ] && echo 真 ||echo 假
真
[root@lsy script]# [ -z "$oldboy" ] && echo 真 ||echo 假
假
[root@lsy script]# 

-z 字符长度为0则为真
-n 长度不为0 则为真
在这里插入图片描述
字符1等于字符2 则为真
否则为假

[root@lsy script]# [ "$info01" = "$info02" ] && echo "真" ||echo "假"
假
[root@lsy script]# 

同时判断多个条件?

应用03:判断多个字符串是否满足要求

[root@lsy script]# [ "$info01" == oldboy -a "$info02" == oldbgirl ] && echo 满足 || echo 不满足
不满足
[root@lsy script]# 

-a 连接多个条件之间 (并且)
-o 连接多个条件之间 (或者)

-a 连接多个条件之间 (并且)
-o 连接多个条件之间 (或者)

5.数值信息条件表达式书写方式
数值做比较的方法
a > b -gt
a < b -lt
a >=b -ge
a <= b -le
a = b -eq
a != b -nq

在这里插入图片描述
说明:建议在利用单中括号进行数值比较表达式书写时,尽量使用-lt -gt -eq 参数进行比较
如果直接使用 符号,容易出现问题。

====================================================================

shell脚本编写章节--第三个阶段
=====================================================================
01. 课程概述说明
    变量算法或者变量比对方法
	条件表达式书写方法
	
02. 课程知识回顾
    1) 变量定义方式:  直接定义变量  传参定义变量  交互式定义变量 (read)
	2) 特殊变量信息:  $0 $n  $# $* $@  $?  $$  $! $_ (等价于esc .)
	3) 变量子串概念:  oldboy=123456 ${}  ${#}  
	4) 变量替换概念:  oldboy=    
	   ${oldboy:-临时变量信息}           ${oldboy:=新的变量信息}
	   ${oldboy:?没有设置变量提示信息}   ${oldboy:+有设置变量提示信息}    
	   
	作业说明:
	01: 案例01:编写修改主机名和IP地址脚本	 
        思路: 
        1) 如何用命令修改主机名 修改IP地址
           hostnamectl set-hostname oldboy
           sed -r "/IPADDR/s#(IPADDR=).*#\110.0.0.8#g" /etc/sysconfig/network-scripts/ifcfg-eth0		   
	    2) 脚本编写变量设置方法
		   传参设置    交互设定
		#!/bin/bash
        # xxxx
        
        New_Hostname="$1"
        New_Ip="$2"
        Network_Config="/etc/sysconfig/network-scripts/ifcfg-eth0"
        
        [ $# -ne 2 ] && {
              echo "Usage: $0 {请写出修改主机名称和IP地址信息.}" 
              exit
        }
        
        # 修改主机名称
        hostnamectl set-hostname "$New_Hostname"
        [ $? -eq 0 ] && echo  "主机名称修改完毕" || echo "主机名称修改失败"
        
        # 修改网卡地址
        cp $Network_Config  /tmp/
        [ -f /tmp/ifcfg-eth0  ] || {
                echo "网卡配置文件备份失败,无法修改地址信息"
                exit
        }  
        sed -ri "/IPADDR/s#(IPADDR=).*#\1${New_Ip}#g" $Network_Config
        grep "$New_IP" $Network_Config &>/dev/null
        [ $? -eq 0 ] && echo "主机地址修改完毕" || echo "主机地址修改失败" 
        
        read -p "确认是否重启网络(yes|no): " ans
        [ "$ans" == "yes" ] && systemctl restart network    
		
	
    02: 案例02:编写测试域名访问脚本
	    ping -c 3 -W 1  $url/$ip
	
	
03. 变量算法或者变量比对方法
    1) 变量算法相关符号信息 
	   运算符号表信息   参见excel表
	   运算命令信息     参见excel表
	   
	2) 数值计算方式
	$(())   -- 实现数值信息运算  *不支持小数运算*   重点关注
	· 应用1) : 简单数值信息
	  [root@oldboy ~ 10:55:52]# echo $((4+4))
      8
      [root@oldboy ~ 10:56:02]# echo $((4-4))
      0
      [root@oldboy ~ 10:56:06]# echo $((4*4))
      16
      [root@oldboy ~ 10:56:13]# echo $((4/4))
      1
      [root@oldboy ~ 10:56:39]# echo $((2**3))
      8
      [root@oldboy ~ 10:56:44]# echo $((5%3))
      2
    · 应用2) : 识别变量信息做运算
	  [root@oldboy ~ 10:57:16]# a=10
      [root@oldboy ~ 10:58:41]# echo $((a+1))
      11
      [root@oldboy ~ 10:58:57]# echo $((a*2))
      20
	· 应用3) : 用于数值比较判断
      [root@oldboy ~ 11:02:15]# echo $((3<8))
      1
      [root@oldboy ~ 11:02:51]# echo $((3>8))
      0
      [root@oldboy ~ 11:03:19]# echo $((8=8))
      -bash: 8=8: attempted assignment to non-variable (error token is "=8")
      [root@oldboy ~ 11:03:54]# echo $((8==8))
      1
      [root@oldboy ~ 11:04:12]# echo $((7==8))
      0
      [root@oldboy ~ 11:04:26]# echo $((7!=8))
      1
      [root@oldboy ~ 11:04:35]# echo $((3<8 && 5==5))
      1
      [root@oldboy ~ 11:05:17]# echo $((3>8 && 5==5))
      0
      [root@oldboy ~ 11:05:36]# echo $((3>8 || 5==5))
      1
      [root@oldboy ~ 11:05:57]# echo $((3>8 || 5==6))
      0	
	  说明: 以上比较信息成立会使用返回值1表示  以上比较信息不成立会使用返回值0

	· 应用4) : 实现自增运算 自减运算
	  自增运算:
	  a=0  -->  a=a+1  运算一次 1 运算二次 2 运算三次 3  
	  以上自增运算简写方式
	  a++ : 先进行运算, 运算完不会马上进行赋值, 重新调用时才显示赋值信息  (默认)
	  ++a : 先进行运算, 运算完将会马上进行赋值, 直接显示运算结果
	  [root@oldboy ~ 11:13:52]# a=0
      [root@oldboy ~ 11:13:57]# echo $((a++))  a=a+1
      0
      [root@oldboy ~ 11:14:03]# echo $a
      1
      [root@oldboy ~ 11:14:27]# a=0
      [root@oldboy ~ 11:14:43]# echo $((++a))  a=a+1
      1
      [root@oldboy ~ 11:14:53]# echo $a
      1

	  自键运算:
      a=10 -->  a=a-1  运算一次 9 运算二次 8 运算三次 7
      以上自增运算简写方式
	  a-- : 先进行运算, 运算完不会马上进行赋值, 重新调用时才显示赋值信息  (默认)
	  --a : 先进行运算, 运算完将会马上进行赋值, 直接显示运算结果
      [root@oldboy ~ 11:14:58]# a=10
      [root@oldboy ~ 11:24:22]# echo $((a--))
      10
      [root@oldboy ~ 11:25:20]# echo $a
      9
      [root@oldboy ~ 11:25:27]# a=10
      [root@oldboy ~ 11:25:33]# echo $((--a))
      9
      [root@oldboy ~ 11:25:38]# echo $a
      9

      ===========================================================================
	  脚本案例: 编写小脚本, 可以实现2位数加减乘除运算
	  #!/bin/bash

      a=$1
      b=$2
      
      [ $# -ne 2 ] && {
          echo "请输入两位数字信息"
          exit
      }
      
      echo "a-b=$((a-b))"
      echo "a+b=$((a+b))"
      echo "a*b=$((a*b))"
      echo "a/b=$((a/b))"
      ===========================================================================
	    
	let   -- 实现数值信息运算	*不支持小数运算*  重点关注 
    说明: 只能调取变量信息进行运算	
	· 应用1) : 识别变量信息做运算
	[root@web01 scripts 11:35:46]# i=2
    [root@web01 scripts 11:36:46]# let i=i+8
    [root@web01 scripts 11:37:06]# echo $i
    10
    [root@web01 scripts 11:37:12]# i=2
    [root@web01 scripts 11:37:25]# i=i+8
    [root@web01 scripts 11:37:31]# echo $i
    i+8
	
	=======================================================================
	企业案例: 监控web页面状态信息, 失败2次, 表示网站出现问题需要进行报警
	#!/bin/bash
    timeout=5
    fails=0
    success=0
    url=$1
    
    while true
    do
        wget --timeout=$timeout --tries=1 http://$url -q
        # 第一关: 判断访问失败或成功次数信息
        if [ $? -ne 0 ]
        then
           let fails=fails+1
        else
           let success++
        fi
        # 第二关: 成功情况如何打破循环
        if [ $success -eq 1 ]
        then
           echo "页面访问成功"
           exit
        fi
        # 第三关: 失败情况如何打破循环
        if [ $fails -eq 2 ]
        then
          echo "页面访问2次均失败"
          exit
        fi
    done 
	=======================================================================

    
	expr   -- 实现数值信息运算  不支持小数运算  重点关注
	应用1) : 做数值信息简单运算
	[root@web01 scripts 12:18:40]# expr 1 + 1
    2
    [root@web01 scripts 12:19:01]# expr 2 - 1
    1
    [root@web01 scripts 12:19:08]# expr 2 * 3
    expr: syntax error
    [root@web01 scripts 12:19:15]# expr 2 \* 3
    6
    [root@web01 scripts 12:19:41]# expr 6 / 3
    2
    [root@web01 scripts 12:19:53]# expr 6 ** 3
    expr: syntax error
    [root@web01 scripts 12:20:06]# expr 2 \*\* 3
    expr: syntax error

    应用2) : 判断输入参数信息是否为整数
	[root@web01 scripts 12:21:24]# i=5
    [root@web01 scripts 12:21:38]# expr $i + 6
    11
    [root@web01 scripts 12:21:56]# echo $?
    0
    [root@web01 scripts 12:22:05]# i=oldboy
    [root@web01 scripts 12:22:19]# expr $i + 6
    expr: non-integer argument
    [root@web01 scripts 12:22:21]# echo $?
    2
    [root@web01 scripts 12:22:31]# i=1.5
    [root@web01 scripts 12:22:46]# expr $i + 6
    expr: non-integer argument
    [root@web01 scripts 12:22:48]# echo $?
    2
	============================================================
	补充说明: expr match
	if [[ `expr match "$1" "[0-9]*$"` == 0 ]]
    then
        echo "$1 is not int"
    else
        echo "$1 is int"
    fi
	============================================================
	
	脚本案例: 编写判断输入参数是否是整数信息脚本
	#!/bin/bash

    a=$1
    expr $a + 0 &>/dev/null
    [ $? -eq 0 ] && echo 输入的是整数信息 || echo 输入的是非整数信息
	
	多个参数判断是否为整数
	for i in "$@" 
	do  
	    expr $i + 0 &>/dev/null
        [ $? -ne 0  ] && echo 输入的多参数中有非整数信息 	
	done
	
    应用3) : 统计字符串长度信息
    [root@web01 scripts 12:43:04]# oldboy="I am oldboy teacher"
    [root@web01 scripts 14:42:17]# expr length "$oldboy"
    19
	
	应用4) : 匹配验证文件扩展名信息
	#!/bin/bash
    if expr "$1" : ".*\.jpg" &>/dev/null
    then 
       echo "这个传参文件是一个图片文件"
    else
       echo "这个传参文件不是图片信息"
    fi

	
	bc   -- 实现数值信息运算   支持小数进行运算  了解
	[root@web01 scripts 15:17:59]# echo 3+5|bc
    8
    [root@web01 scripts 15:18:05]# echo 7-5|bc
    2
    ==================================================================
	企业面试题: 如何利用脚本计算1+2+3+4..10总和数值
    方法一:
	awk 'BEGIN{for (i=1; i<=10; i++) a=a+i; print a}'
	
	方法二:
	seq -s "+" 10|bc
	
	方法三: 
	# echo {1..10}|tr " " "+"|bc
    55
    ==================================================================
	
    awk  -- 实现数值信息运算  支持小数运算
	方法一: 
	awk 'BEGIN{print 5*10-3+6}'
	方法二:
	echo 5 10 3 6|awk '{print $1*$2-$3+$4}'
	
	declare  $[]  --- 实现数值信息运算  
    # a=5;declare -i a=a+10;echo $a
    15
	# i=5
    [root@web01 scripts 15:36:47]# i=$[i+6]
    [root@web01 scripts 15:37:08]# echo $i
    11

04. 脚本条件表达式编写方式  
    说明: 为了使脚本执行更加合理, 定义一些条件
	================================================
	sh test.sh  1 2  定义条件  传入的参数必须是两个
	sh test.sh  10   定义条件  传入的参数必须是整数
    ================================================
	
	1. 条件表达式书写方式
	· test <测试表达式>
	  说明: 利用test 进行表达式书写进行判断条件信息
	  规范: test命令和"<测试表达式>"之间至少有一个空格
	  
	  应用01: 判断指定一个文件信息是否存在
	  [root@web01 scripts 16:14:07]# ll /oldboy/oldboy.txt
      ls: cannot access /oldboy/oldboy.txt: No such file or directory
      [root@web01 scripts 16:14:21]# 
      [root@web01 scripts 16:14:29]# test -f /oldboy/oldboy.txt && echo 文件信息存在 || echo 文件信息不存在
      文件信息不存在
      [root@web01 scripts 16:15:30]# touch /oldboy/oldboy.txt
      [root@web01 scripts 16:15:50]# test -f /oldboy/oldboy.txt && echo 文件信息存在 || echo 文件信息不存在
      文件信息存在

	  应用02: 判断指定一个字符串长度是否为0
	  [root@web01 scripts 16:15:52]# oldboy="linux69"
      [root@web01 scripts 16:17:42]# echo ${#oldboy}
      7
      [root@web01 scripts 16:17:51]# test -z "$oldboy" && echo 字符串长度为0 || echo 字符串长度为:${#oldboy}
      字符串长度为:7
      [root@web01 scripts 16:19:17]# unset oldboy
      [root@web01 scripts 16:19:35]# echo ${#oldboy}
      0
      [root@web01 scripts 16:19:38]# test -z "$oldboy" && echo 字符串长度为0 || echo 字符串长度为:${#oldboy}
      字符串长度为0
	  
      ============================================================================	 
      补充总结:  条件表达式书写方式 
	  · 利用各种参数进行判断
        -d文件, d的全拼directory     文件存在且为目录则为真, 即测试表达式成立
		-f文件, f的全拼file          文件存在且为普通文件则为真, 即测试表达式成立
		-e文件, e的全拼为exist       文件存在则为真, 即测试表达式成立 注意: 区别于 f, -e不辨别是目录还是文件
        -r文件, r的全拼为read        文件存在且可读则为真, 即测试表达式成立
        -w文件, w的全拼为write		文件存在且可写则为真, 即测试表达式成立
		-x文件, x的全拼为executable  文件存在且可执行则为真, 即测试表达式成立
	    -s文件, s的全拼为size        文件存在且文件大小不为0则为真, 即测试表达式成立
	  ===========================================================================
	  
	· [ <测试表达式> ]  推荐
	  说明: 利用中括号 进行表达式书写进行判断条件信息
	  规范: []的边界和内容之间至少有一个空格
	  
	  应用01: 判断指定一个文件信息是否存在
	  [root@web01 scripts 16:36:47]# [ -f /oldboy/oldboy.txt ] && echo 文件已经存在 || echo 文件不存在
      文件已经存在
      [root@web01 scripts 16:37:34]# [ -f /oldboy/oldgirl.txt ] && echo 文件已经存在 || echo 文件不存在
      文件不存在
	  
	  应用02: 判断文件属性信息
	  判断读权限
	  [oldboy@web01 ~ 16:41:11]$ [ -r /oldboy/oldboy.txt ] && echo 此文件已有读权限 || echo 此文件未设置读权限
      此文件未设置读权限
      [oldboy@web01 ~ 16:44:39]$ [ -r /oldboy/oldboy.txt ] && echo 此文件已有读权限 || echo 此文件未设置读权限
      此文件已有读权限

	  判断写权限
	  [oldboy@web01 ~ 16:41:26]$ [ -w /oldboy/oldboy.txt ] && echo 此文件已有写权限 || echo 此文件未设置写权限
      此文件未设置写权限
      [oldboy@web01 ~ 16:45:53]$ [ -w /oldboy/oldboy.txt ] && echo 此文件已有读权限 || echo 此文件未设置读权限
      此文件已有读权限
	  
	  判断执行权限
      [oldboy@web01 ~ 16:41:50]$ [ -x /oldboy/oldboy.txt ] && echo 此文件已有执行权限 || echo 此文件未设置执行权限
      此文件未设置执行权限
      [oldboy@web01 ~ 16:46:01]$ [ -x /oldboy/oldboy.txt ] && echo 此文件已有读权限 || echo 此文件未设置读权限
      此文件已有读权限
	  
	· [[ <测试表达式> ]]
      说明: 利用双中括号 进行表达式书写进行判断条件信息
	  规范: [[]]的边界和内容之间至少有一个空格
	  
	  应用01: 
	  [oldboy@web01 ~ 16:46:07]$ [[ -f /oldboy/oldboy.txt ]] && echo 文件已经存在 || echo 文件不存在
      文件已经存在
      [oldboy@web01 ~ 16:48:09]$ [[ -f /oldboy/oldgirl.txt ]] && echo 文件已经存在 || echo 文件不存在
      文件不存在
	  
	· ((<测试表达式>))
	  说明: 利用双小括号 进行表达式书写进行判断条件信息
	  (())(双小括号)两端不需要有空格
	  
	2. 条件表达式识别变量信息
       [oldboy@web01 ~ 16:51:57]$ file=/oldboy/oldboy.txt   文件存在
       [oldboy@web01 ~ 16:54:57]$ [ -f "$file" ] && echo "1(真)" || echo "0(假)"
       1(真)
       [oldboy@web01 ~ 16:55:14]$ file=/oldboy/oldgirl.txt  文件不存在
       [oldboy@web01 ~ 16:55:23]$ [ -f "$file" ] && echo "1(真)" || echo "0(假)"
       0(假)

       [oldboy@web01 ~ 16:57:56]$ echo $file
       [oldboy@web01 ~ 16:58:00]$ [ -f $file ] && echo "1(真)" || echo "0(假)"
       1(真)
       [oldboy@web01 ~ 16:58:11]$ [ -f "$file" ] && echo "1(真)" || echo "0(假)"
       0(假)
	   总结: 只要条件表达式中需要识别加载变量, 就直接加上双引号识别

	3. 条件表达式特殊书写方式
	   [ -f "$file" ] && { 
	       命令1 
		   命令2
	   }
	   
	   应用01: 判断目录是否存在 如果存在提示目录已存在 并在目录中创建oldboy.txt  
	   #!/bin/bash
       dir_info="/oldboy"
       [ -d "$dir_info" ] && {
          echo 此目录已经创建
          cd /oldboy
          touch oldboy.txt 
       }
       
	   练习01: 判断目录是否存在  如果目录不存在提示目录不存在, 要创建此目录
	   #!/bin/bash
       dir_info=""
       [ -d "$dir_info" ] || {
          echo 此目录不存在需要进行创建
		  mkdir /oldboy
       }
	   
	4. 	字符串测试判断   
	    测试判断字符串信息方法
	    参考表格信息
		
		应用01: 检查字符串信息是否非空
		[root@web01 scripts 17:06:51]# oldboy="linux69"
        [root@web01 scripts 17:17:55]# echo $oldboy
        linux69
        [root@web01 scripts 17:18:03]# [ -n "$oldboy" ] && echo "1(真)" || echo "0(假)"
        1(真)
        [root@web01 scripts 17:19:28]# [ -z "$oldboy" ] && echo "1(真)" || echo "0(假)"
        0(假)
	
	    应用02: 字符串比较说明  (字符串比较 字符串和变量信息都要加上双信号)
		[root@web01 scripts 17:25:56]# [ $info01 == 10 ] && echo "1真" || echo "0假"
        -bash: [: ==: unary operator expected
        0假
        [root@web01 scripts 17:26:12]# [ "$info01" == "10" ] && echo "1真" || echo "0假"
        0假

	    应用03: 判断多个字符串信息是否多个条件都满足要求
        [root@web01 scripts 17:26:53]# info01=oldboy
        [root@web01 scripts 17:30:24]# info02=oldgirl
        [root@web01 scripts 17:30:32]# [ "$info01" == "oldboy" "$info02" == "oldgirl" ] && echo "1真" || echo "0假"
        -bash: [: too many arguments
        0假
        [root@web01 scripts 17:32:04]# [ "$info01" == "oldboy" && "$info02" == "oldgirl" ] && echo "1真" || echo "0假"
        -bash: [: missing `]'
        0假
        [root@web01 scripts 17:32:12]# [ "$info01" == "oldboy" -a "$info02" == "oldgirl" ] && echo "1真" || echo "0假"
        1真
        [root@web01 scripts 17:32:28]# info01=123
        [root@web01 scripts 17:32:44]# [ "$info01" == "oldboy" -a "$info02" == "oldgirl" ] && echo "1真" || echo "0假"
        0假
        [root@web01 scripts 17:32:49]# [ "$info01" == "oldboy" -o "$info02" == "oldgirl" ] && echo "1真" || echo "0假"
        1真
		
	5. 	数值信息条件表达式书写方式
        数值做表较方法
        a > b     -gt
        a < b     -lt 
        a >= b    -ge
        a <= b    -le 
        a = b     -eq 
        a != b    -ne		 
     
	    应用01: 数值信息简单比较
		[root@web01 scripts 17:34:30]# [ 5 > 4 ] && echo 1真 || echo 0假
        1真
        [root@web01 scripts 18:00:10]# [ 5 < 4 ] && echo 1真 || echo 0假
        1真
        [root@web01 scripts 18:00:33]# [[ 5 < 4 ]] && echo 1真 || echo 0假
        0假
        [root@web01 scripts 18:01:06]# [ 5 \< 4 ] && echo 1真 || echo 0假
        0假
        [root@web01 scripts 18:01:23]# [ 5 -gt 4 ] && echo 1真 || echo 0假
        1真
        [root@web01 scripts 18:01:53]# [ 5 -lt 4 ] && echo 1真 || echo 0假
        0假
        [root@web01 scripts 18:02:00]# [ 5 -eq 5 ] && echo 1真 || echo 0假
        1真
        [root@web01 scripts 18:02:25]# [ 5 -ne 5 ] && echo 1真 || echo 0假
        0假
		说明: 建议在利用单中括号进行数值比较表达式书写时, 尽量使用 -lt -gt .. -eq参数进行
		      如果直接使用 < > <= >= .. 可能会有问题



作业: 
01. 编写监控脚本  判断磁盘使用率
    只要磁盘使用率 高于3% 进行报警通知
02. 编写监控脚本  判断内存使用率
    只要内存使用率 低于10% 进行报警通知
03. 编写收集系统信息脚本 
    收集主机名称
	网卡IP地址信息 (eth0)
	虚拟平台 ???  vmware kvm 
	系统版本信息   
	系统内核信息
	系统使用外网IP(公网)

if判断知识
case判断知识

   
复杂脚本问题:
01. 根据传参数值生成杨辉三角型
    传参数值为  2
	 *
	* *
	传参数值为  3
	  *
	 * * 
	* * *
	传参数值为  4
	   *
	  * * 
	 * * *
	* * * *

在这里插入图片描述

发布了224 篇原创文章 · 获赞 19 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_42506599/article/details/105281466