1.变量子串 子串的切片 了解
[root@shell ~]# echo ${name:2:2}
am
[root@shell ~]# echo ${name:2:3}
am
[root@shell ~]# echo ${name:2:4}
am l
2.子串的长度统计 笔试题
第一种统计方式:
[root@shell ~]# echo $name|wc -L
13
第二种统计方式:
[root@shell ~]# expr length "$name"
13
第三种统计方式:
[root@shell ~]# echo $name|awk '{print length}'
13
第四种统计方式:
[root@shell ~]# echo ${#name}
13
统计出长度小于3的字符串
[root@shell ~]# echo I am lizhenya I am 18
I am lizhenya I am 18
[root@shell ~]# echo I am lizhenya I am 18|xargs -n1
I
am
lizhenya
I
am
18
[root@shell ~]# echo I am lizhenya I am 18|xargs -n1|awk '{print length}'
1
2
8
1
2
2
[root@shell ~]# echo I am lizhenya I am 18|xargs -n1|awk '{if(length<3)print}'
I
am
I
am
18
[root@shell ~]# echo I am lizhenya I am 18|awk '{for(i=1;i<=NF;i++)if(length($i)<3)print $i}'
I
am
I
am
18
使用for循环方式
[root@shell ~]# cat for.sh
#!/bin/bash
for i in I am lizhenya I am 18
do
echo ${#i}
done
[root@shell ~]# sh for.sh
1
2
8
1
2
2
[root@shell ~]# cat for.sh
#!/bin/bash
for i in I am lizhenya I am 18
do
[ ${#i} -lt 3 ] && echo $i
done
[root@shell ~]# sh for.sh
I
am
I
am
18
子串的删除 支持通配符
1.#从前面往后删除 ## 贪婪匹配
[root@shell ~]# echo ${url#www.}
baidu.com
[root@shell ~]# echo ${url#www.}
baidu.com
[root@shell ~]# echo $url
www.baidu.com
[root@shell ~]# echo ${url#*.}
baidu.com
[root@shell ~]# echo ${url#*.*c}
om
[root@shell ~]# echo ${url#*.*.}
com
[root@shell ~]# echo ${url##*.}
com
2.从后面往前删除
[root@shell ~]# echo $url
www.baidu.com
[root@shell ~]# echo ${url%.*}
www.baidu
[root@shell ~]# echo ${url%.*.*}
www
[root@shell ~]# echo ${url%%.*}
www
3.子串的替换 /替换谁/替换成谁 /// 贪婪替换
[root@shell ~]# echo $url
www.baidu.com
[root@shell ~]# echo ${url/w/W}
Www.baidu.com
[root@shell ~]# echo ${url//w/W}
WWW.baidu.com
[root@shell ~]# echo ${url/www/WWW}
WWW.baidu.com
[root@shell ~]# echo ${url/baidu/sina}
www.sina.com
小结:
子串
统计字符串长度
${#变量}
统计小于3的字符串
子串的切片
${变量:2:2}
子串的删除 ## %%
子串的替换 // ///
2.数值运算
expr 只支持整数运算
[root@shell ~]# expr oldboy
oldboy
[root@shell ~]# expr hehe
hehe
[root@shell ~]# expr 1 + 1
2
[root@shell ~]# expr 1 + 100
101
[root@shell ~]# expr 10 - 10
0
[root@shell ~]# expr 10 * 10
expr: syntax error
[root@shell ~]# expr 10 \* 10
100
[root@shell ~]# expr 10 / 10
1
[root@shell ~]# expr 1 + 1.5
expr: non-integer argument
案例: 判断传入的参数是否为整数
[root@shell scripts]# cat expr.sh
#!/bin/bash
read -p "请输入你的年龄: " age
expr 1 + $age &>/dev/null
[ $? -ne 0 ] && echo "请输入整数" && exit
echo $age
exit指定返回值
[root@shell scripts]# cat expr.sh
#!/bin/bash
read -p "请输入你的年龄: " age
expr 1 + $age &>/dev/null
[ $? -ne 0 ] && echo "请输入整数" && exit 100
echo $age
[root@shell scripts]# sh expr.sh
请输入你的年龄: 20.5
请输入整数
[root@shell scripts]# echo $?
100
$(()) 只支持整数运算 注意不要和$()冲突了 执行的命令和``相同
[root@shell scripts]# echo $((10+10))
20
[root@shell scripts]# echo $((10-10))
0
[root@shell scripts]# echo $((10*10))
100
[root@shell scripts]# echo $((10/10))
1
随机数取余数 RANDOM 0-32767之间的数字
[root@shell scripts]# echo $((RANDOM%100+1))
82
$[] 只支持整数运算
[root@shell scripts]# echo $[10+10]
20
[root@shell scripts]# echo $[10-10]
0
[root@shell scripts]# echo $[10/10]
1
[root@shell scripts]# echo $[10*10]
100
[root@shell scripts]# echo $[10**10]
10000000000
let 只支持整数运算
[root@shell ~]# let a=1+1
[root@shell ~]# echo $a
2
[root@shell ~]# let a=1*10
[root@shell ~]# echo $a
10
i++
let i++ =========== let i=i+1
[root@shell ~]# let i=i+1
[root@shell ~]# echo $i
2
[root@shell ~]# let i++
[root@shell ~]# echo $i
3
[root@shell ~]# let i=i+1
[root@shell ~]# echo $i
4
直接运算 ++i i++ 相同 都是自增1
++a
[root@shell ~]# let ++a
[root@shell ~]# echo $a
1
unset 取消变量
在使用变量的情况下两个是有区别
i++ 先赋值在运算
++i 先运算在赋值
[root@shell ~]# a=1
[root@shell ~]# b=1
[root@shell ~]# let i=a++
[root@shell ~]# let c=++b
[root@shell ~]# echo $i
1
[root@shell ~]# echo $c
2
bc 支持整数和小数运算
[root@shell ~]# echo 10+10|bc
20
[root@shell ~]# echo 10+10.5|bc
20.5
[root@shell ~]# echo 10*10.5|bc
105.0
[root@shell ~]# echo 10-10.5|bc
-.5
[root@shell ~]# echo 10/10.5|bc
0
awk
[root@shell ~]# awk 'BEGIN{print 10+10}'
20
[root@shell ~]# echo 10 20|awk '{print $1+$2}'
30
[root@shell ~]# echo 10 20|awk '{print $1*$2}'
200
[root@shell ~]# echo 10 20|awk '{print $1/$2}'
0.5
[root@shell ~]# echo 10 20|awk '{print $1^$2}'
100000000000000000000
运算小结:
expr $(())运算速度快 $[] let bc awk pythonnum
案例: 使用read传参写一个计算器案例 数字做判断 只能是整数
结果输出:
10+20=
10-20=
10*20=
10/20=
[root@shell scripts]# cat count.sh
#!/bin/sh
read -p "请输入两个数字: " num1 num2
expr $num1 + $num2 &>/dev/null
[ $? -ne 0 ] && echo "请输入整数" && exit 50
echo $num1+$num2=$[$num1+$num2]
echo $num1-$num2=$[$num1-$num2]
echo $num1*$num2=$[$num1*$num2]
echo $num1/$num2=$[$num1/$num2]
3.条件表达式
1)文件表达式
语法结构:
第一种:
test -f /etc/hosts
[root@shell ~]# test -f /etc/hosts && echo "文件存在"
文件存在
[root@shell ~]# test -f /etc/host && echo "文件存在"
[root@shell ~]# test -f /etc/host && echo "文件存在" || echo "文件不存在"
文件不存在
[root@shell ~]# test -f /etc/hosts && echo "文件存在" || echo "文件不存在"
文件存在
第二种: 常用
[ -f /etc/hosts ] # 判断是否为普通文件
[ -d file ] # 文件存在并且为目录
[ -e file ] # 文件存在则为真
[ -r file ] # 文件可读则为真
[ -w file ] # 文件可写则为真
[ -x file ] # 文件可执行则为真
[root@shell ~]# [ -f /etc/passwd ] && echo "文件存在" || echo "文件不存在"
文件存在
[root@shell ~]# [ -f /etc/passwdddd ] && echo "文件存在" || echo "文件不存在"
文件不存在
[root@shell ~]# [ -d /etc/passwd ] && echo "文件存在" || echo "文件不存在"
文件不存在
[root@shell ~]# [ -d /etc/ ] && echo "文件存在" || echo "文件不存在"
文件存在
[root@shell ~]# [ -x /etc/ ] && echo "文件存在" || echo "文件不存在"
文件存在
[root@shell ~]# ll -d /etc
drwxr-xr-x. 79 root root 8192 Oct 19 09:14 /etc
[root@shell ~]# [ -e /etc/ ] && echo "文件存在" || echo "文件不存在"
文件存在
[root@shell ~]# [ -w /etc/hosts ] && echo "文件存在" || echo "文件不存在"
文件存在
注意: 表达式中支持变量和命令
[root@shell ~]# dir=/tmp
[root@shell ~]#
[root@shell ~]# [ -d $dir ] && echo "文件存在" || echo "文件不存在"
文件存在
[root@shell ~]# dir=/tmppppp
[root@shell ~]# [ -d $dir ] && echo "文件存在" || echo "文件不存在"
文件不存在
[root@shell ~]# ls -d /etc/sysconfig/
/etc/sysconfig/
[root@shell ~]# [ -d `ls -d /etc/sysconfig/` ] && echo "文件存在" || echo "文件不存在"
文件存在
案例:
1. -d
[root@shell ~]# [ -d ${name}_$ip ] || mkdir ${name}_$ip
2. -f 案例 functions shell脚本的函数库
[root@shell ~]# [ -f /etc/init.d/functions ]
判断函数库是否存在 存在则加载
[root@shell ~]# [ -f /etc/init.d/functions ] && . /etc/init.d/functions
[root@shell scripts]# cat ping.sh
#!/bin/sh
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
ping -c1 -W1 $1 &>/dev/null
[ $? -eq 0 ] && action "ping $1 is.." /bin/true || action "ping $1 is.." /bin/false
[root@shell scripts]# sh ping.sh www.baidu.com
ping www.baidu.com is.. [ OK ]
[root@shell scripts]# sh ping.sh www.baidu.commmmmm
ping www.baidu.commmmmm is.. [FAILED]
2)数值比较
语法结构
第一种:
test 整数1 比较符 整数2
第二种:
[ 整数1 比较符 整数2 ]
比较符
INTEGER1 -eq INTEGER2 相等 -eq
INTEGER1 -ge INTEGER2 大于或者等于 -ge
INTEGER1 -gt INTEGER2 大于 -gt
INTEGER1 -le INTEGER2 小于或者等于 -le
INTEGER1 -lt INTEGER2 小于 -lt
INTEGER1 -ne INTEGER2 不等于 -ne
[root@shell ~]# test 10 -eq 10 && echo 成立 || echo 不成立
成立
[root@shell ~]# test 10 -ne 10 && echo 成立 || echo 不成立
不成立
[root@shell ~]# test 10 -ne 5 && echo 成立 || echo 不成立
成立
[root@shell ~]# [ 10 -eq 10 ] && echo 成立 || echo 不成立
成立
[root@shell ~]# [ 10 -ne 10 ] && echo 成立 || echo 不成立
不成立
[root@shell ~]# [ 15 -ne 10 ] && echo 成立 || echo 不成立
成立
[root@shell ~]# [ 15 -gt 10 ] && echo 成立 || echo 不成立
成立
[root@shell ~]# [ 10 -ge 10 ] && echo 成立 || echo 不成立
成立
[root@shell ~]# [ 10 -le 10 ] && echo 成立 || echo 不成立
成立
支持命令
[root@shell ~]# [ 50 -gt `echo $((RANDOM%100))|tee file.txt` ] && echo "成立" || echo 不成立
成立
[root@shell ~]# cat file.txt
20
[root@shell ~]# [ 20 -eq `cat /etc/passwd|wc -l` ]
[root@shell ~]# echo $?
0
案例1:统计磁盘使用率 如果大于80%则发送邮件 否则输出当前的使用率正常
1.查看磁盘使用率
df -h 取行
[root@shell ~]# df -h|awk 'NR==6'
/dev/sda3 18G 1.9G 16G 11% /
[root@shell ~]# df -h|grep /dev/sda3
/dev/sda3 18G 1.9G 16G 11% /
[root@shell ~]# df -h|grep /$
/dev/sda3 18G 1.9G 16G 11% /
[root@shell ~]# df -h|sed -n '/\/$/p'
/dev/sda3 18G 1.9G 16G 11% /
[root@shell ~]# df -h|awk '/\/$/'
/dev/sda3 18G 1.9G 16G 11% /
取到百分比
[root@shell ~]# df -h|awk '/\/$/'|awk '{print $(NF-1)}'
11%
和我们的值进行比较 test []
写入脚本
[root@shell scripts]# cat disk.sh
#!/bin/sh
use_disk=`df -h|awk '/\/$/'|awk '{print $(NF-1)}'`
[ ${use_disk%\%} -gt 10 ] && echo "send mail......" || echo "磁盘使用率正常 当前使用率为: $use_disk"
案例2: 内存使用百分比 大于5报警 小于5输出正常值
统计百分比
[root@shell ~]# free|awk 'NR==2{print $3/$2*100}'
8.49266
案例3: 统计负载 如果大于1则报警 小于则输出正常值 1分钟的平均值 使用dd压测到1以上进行测试
练习题awk
统计出当前系统的主机名称 IP地址 虚拟平台 外网IP地址 Linux系统版本 内核版本 磁盘使用率 内存使用率
输出到屏幕上
系统主机名: shell
ip地址为: 10.0.0.7
外网IP地址: 125.33.245.251
。。。。
。。。。
整数比较案例 输入两个数字进行比对 大于 等于 小于
[root@shell scripts]# cat diff.sh
#!/bin/sh
[ $1 -gt $2 ] && echo "$1>$2"
[ $1 -lt $2 ] && echo "$1<$2"
[ $1 -eq $2 ] && echo "$1=$2"
[root@shell scripts]# sh diff.sh 20 30
20<30
[root@shell scripts]# sh diff.sh 20 10
20>10
[root@shell scripts]# sh diff.sh 20 20
20=20
死循环
[root@shell scripts]# cat diff.sh
#!/bin/sh
while true
do
read -p "请输入两个整数: " num1 num2
expr $num1 + $num2 &>/dev/null
[ $? -ne 0 ] && echo "请输入整数" && exit 2
[ $num1 -gt $num2 ] && echo "$num1>$num2"
[ $num1 -lt $num2 ] && echo "$num1<$num2"
[ $num1 -eq $num2 ] && echo "$num1=$num2"
done
多整数比较
语法结构:
[ 整数1 比较符 整数2 ]
-o or 或者 -a and并且
[ 整数1 比较符 整数2 -o 整数1 比较符 整数2 -o 整数1 比较符 整数2 ]
[root@shell ~]# [ 10 -eq 10 -o 10 -gt 20 -o 20 -lt 10 ] && echo "成立" ||echo "不成立"
成立
[root@shell ~]# [ 10 -eq 10 -a 10 -gt 20 -o 20 -lt 10 ] && echo "成立" ||echo "不成立"
不成立
[root@shell ~]# [ 10 -eq 10 -a 10 -gt 20 -o 2 -lt 10 ] && echo "成立" ||echo "不成立"
成立
支持正则 [[]] && 并且 || 或者
[root@shell ~]# [[ 10 -eq 10 && 10 -gt 5 ]] && echo "成立" ||echo "不成立"
成立
[root@shell ~]# [[ 10 -eq 20 && 10 -gt 5 ]] && echo "成立" ||echo "不成立"
不成立
[root@shell ~]# [[ 10 -eq 20 || 10 -gt 5 ]] && echo "成立" ||echo "不成立"
成立
案例:反向破解随机数 通过MD5值破解出对应的数字
[root@shell ~]# echo $RANDOM|md5sum |cut -c1-8
2d8a8c96
[root@shell ~]# echo $RANDOM|md5sum |cut -c1-8
caae07ff
[root@shell ~]# echo $RANDOM|md5sum |cut -c1-8
1d93122c
[root@shell ~]# echo $RANDOM|md5sum |cut -c1-8
a29fff57
字符串比对
语法结构:
test user = user
[ "user" = "user" ]
[root@shell ~]# [ "root" = "root" ] && echo 成立 || echo 不成立
成立
[root@shell ~]# [ "roo" = "root" ] && echo 成立 || echo 不成立
不成立
[root@shell ~]# [ ! "roo" = "root" ] && echo 成立 || echo 不成立
成立
[root@shell ~]# [ $USER = "root" ] && echo 成立 || echo 不成立
成立
[root@shell ~]# [ root = root -a user = user ]
[root@shell ~]# [ root = root -a user = user ] && echo 成立 || echo 不成立
成立
[root@shell ~]# [ oot = root -a user = user ] && echo 成立 || echo 不成立
不成立
[root@shell ~]# [ oot = root -o user = user ] && echo 成立 || echo 不成立
成立
[root@shell ~]# AAA=""
[root@shell ~]# [ -z $AAA ] && echo 成立 || echo 不成立
成立
[root@shell ~]# AAA="aaa"
[root@shell ~]# [ -z $AAA ] && echo 成立 || echo 不成立
不成立
[root@shell ~]# [ -n $AAA ] && echo 成立 || echo 不成立
成立
案例: 传参不允许字符串为空
[root@shell scripts]# cat hostname.sh
#!/bin/bash
#修改主机名称
read -p "输入主机名称: " name
[ -z $name ] && echo "必须输入名称" && exit
三个判断
1.以返回结果判断 $?
2.判断数字是否为整数 expr
3.判断字符串不允许为空 -z
4.使用正则判断数字是否为整数 [[ $num =~ ^[0-9]+$ ]]
[root@shell scripts]# cat ping.sh
#!/bin/sh
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
while true
do
read -p "请输入一个ip或url地址: " url
[ $url = exit -o $url = q ] && exit
ping -c1 -W1 $url &>/dev/null
re=$?
[ -z $url ] && echo "必须传一个url地址" && exit
[ $re -eq 0 ] && action "ping $url is.." /bin/true || action "ping $url is.." /bin/false
done
正则比对
[root@shell ~]# [[ root =~ ^r ]] && echo 成立 || echo 不成立
成立
[root@shell ~]# [[ root =~ t$ ]] && echo 成立 || echo 不成立
成立
[root@shell ~]# [[ $USER =~ t$ ]] && echo 成立 || echo 不成立
成立
[root@shell ~]# AAA="BBB"
[root@shell ~]# [[ $AAA =~ ^[A-Z]+ ]]
[root@shell ~]# [[ $AAA =~ ^[A-Z]+ ]] && echo 成立 || echo 不成立
成立
[root@shell ~]# AAA="BB1B"
[root@shell ~]# [[ $AAA =~ ^[A-Z]+ ]] && echo 成立 || echo 不成立
成立
[root@shell ~]# [[ $AAA =~ ^[A-Z]+$ ]] && echo 成立 || echo 不成立
不成立
[root@shell ~]# AAA="BBAB"
[root@shell ~]# [[ $AAA =~ ^[A-Z]+$ ]] && echo 成立 || echo 不成立
成立
[root@shell ~]# [[ $AAA =~ ^[A-Za-z]+$ ]] && echo 成立 || echo 不成立
成立
案例:
[root@shell ~]# cat name.sh
#!/bin/sh
read -p "请输入你的姓名:[A-Za-z] " name
[[ ! $name =~ ^[A-Za-z]+$ ]] && echo "必须严格按照规范来写" && exit
echo $name
[root@shell ~]# cat name.sh
#!/bin/sh
read -p "请输入你的姓名:[A-Za-z] " name
[[ ! $name =~ ^[A-Za-z]+$ ]] && echo "必须严格按照规范来写" && exit
echo $name
read -p "请输入你的年龄:[0-9] " age
[[ ! $age =~ ^[0-9]+$ ]] && echo "必须严格按照规范来写你的年龄" && exit
echo $age
[root@shell ~]# sh name.sh
请输入你的姓名:[A-Za-z] oldboy
oldboy
请输入你的年龄:[0-9] 1000
1000
小结:
子串知识:
子串的切片
echo ${name:2:2}
长度统计
echo ${#name}
长度统计小于3的
for i in I am lizhenya I am 18
do
[ ${#i} -lt 3 ] && echo $i
done
echo I am lizhenya I am 18|xargs -n1|awk '{if(length<3)print }'
echo I am lizhenya I am 18|awk '{for(i=1;i<=NF;i++)if(length($i)<3)print $i}'
子串的删除 ## 贪婪匹配 %% 贪婪匹配
url=www.baidu.com
echo ${url#*.}
echo ${url%.*}
替换 /// 贪婪替换
echo ${url/www/news}
数值运算
expr
$(())
$[]
let
bc
awk
计算器
条件表达式 取反加!
文件判断
-f -d -e -r -x -w
-d 判断目录
-f functions 函数库 action 输出 /bin/true /bin/false
整数比较
-gt
-lt
-ge
-le
-ne
-eq
内存使用率
磁盘使用率
平均1分钟负载大于1
练习awk案例
多整数比较 -o -a
字符串比对
[ "$USER" = "root" ]
-z 为0为真
-n 不为空则为真
正则比对
[[ $USER =~ ^r ]]
[[ $USER =~ ^[A-Za-z]+$ ]]
[[ $USER =~ ^[0-9]+$ ]]