修改网卡信息
[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 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
*
* *
* * *
* * * *