一. Shell传参方式
第一种传参方式:
直接传参: $1 脚本的第一个参数 $2 脚本的第二个参数
[root@shell day2]# cat env.sh
#!/bin/sh
echo $1 $2
[root@shell day2]# sh env.sh oldboy 18
oldboy 18
[root@shell day2]# cat env.sh
#!/bin/sh
echo name: $1
echo age: $2
[root@shell day2]# sh env.sh oldboy 123
name: oldboy
age: 123
[root@shell day2]# cat env.sh
#!/bin/sh
echo name=$1
echo age=$2
[root@shell day2]# sh env.sh oldboy 123
name=oldboy
age=123
第二种传参方式: 赋值传参
[root@shell day2]# cat env.sh
#!/bin/sh
name=$1
age=$2
echo name=$name
echo age=$age
[root@shell day2]# sh env.sh oldboy 123
name=oldboy
age=123
案例:
[root@shell day2]# cat env.sh
#!/bin/sh
touc /tmp/test.txt
result=$?
name=$1
age=$2
echo name=$name
echo age=$age
[ $result -eq 0 ] && echo ok || echo error
[root@shell day2]# sh env.sh oldboy 123
env.sh: line 2: touc: command not found
name=oldboy
age=123
error
第三种传参方式: read读入
[root@shell day2]# cat> env.sh <
read -p "Please Input two env: " name age
echo $name $age
EOF
[root@shell day2]# sh env.sh
Please Input two env: oldboy 123
oldboy 123
[root@shell day2]# cat env.sh
#!/bin/sh
read -p "Please Input name env: " name
read -p "Please Input age env: " age
echo name: $name
echo age: $age
[root@shell day2]#
[root@shell day2]# sh env.sh
Please Input name env: oldboy
Please Input age env: 123
name: oldboy
age: 123
案例: 使用三种传参方式来修改IP地址和主机名称
1)修改IP地址
2)修改主机名称
[root@test day2]# cat name.sh
#!/bin/sh
#修改主机名称
name=$1
hostnamectl set-hostname $name
#修改IP地址
ip_dir=/etc/sysconfig/network-scripts/ifcfg-eth0
#1.获取当前的IP地址
ipadd=`grep ^IP $ip_dir|awk -F. '{print $NF}'`
#2.将获取的当前的IP地址替换成新的IP
read -p "请输入新的ip的最后一位: " ip
sed -i "s#$ipadd#$ip#g" $ip_dir
grep 'IPADDR' $ip_dir
小结: 脚本传参方式三种
直接传参
赋值传参
read传参
二. 数值运算
加减乘除幂取余
1. expr 不支持小数运算
[root@test day2]# expr 1+1
1+1
[root@test day2]# expr oldboy
oldboy
[root@test day2]# expr 1 + 1
2
[root@test day2]# expr 10 - 1
9
[root@test day2]# expr 10 * 1
expr: syntax error
[root@test day2]# expr 10 \* 1
10
案例: 通过expr判断用户输入的是否为整数
[root@test day2]# expr 1 + 1 &>/dev/null
[root@test day2]# echo $?
0
[root@test day2]# expr 1 + 1.5 &>/dev/null
[root@test day2]# echo $?
2
案例: oldboy 不能过99
[root@test day2]# cat env.sh
#!/bin/sh
read -p "Please Input name env: " name
read -p "Please Input age env: " age
expr 1 + $age &>/dev/null
[ $? -ne 0 ] && echo 请输入正确的年龄 && exit
[ ${#age} -gt 2 ] && echo 请输入小于100的年龄 && exit
[ `echo $age|wc -L` -gt 2 ] && echo 请输入小于100的年龄 && exit
[ $age -gt 99 ] && echo 请输入小于100的年龄 && exit
echo name: $name
echo age: $age
---------------------执行结果
[root@test day2]# sh env.sh
Please Input name env: oldboy
Please Input age env: 1
name: oldboy
age: 1
[root@test day2]# sh env.sh
Please Input name env: oldboy
Please Input age env: 99
name: oldboy
age: 99
----------------------
2. $[] 不支持小数运算
[root@test day2]# echo $[1+1]
2
[root@test day2]# echo $[1*1]
1
[root@test day2]# echo $[1*10]
10
[root@test day2]# echo $[1-10]
-9
[root@test day2]# echo $[10-10]
0
[root@test day2]# echo $[10**10]
10000000000
[root@test day2]# echo $[10%10]
0
3. $(()) 不支持小数 运算效率最高
[root@test day2]# echo $((10*10))
100
[root@test day2]# echo $((10**10))
10000000000
[root@test day2]# echo $((10/10))
1
[root@test day2]# echo $((10/10*10))
10
[root@test day2]# echo $((10/10*10-2))
8
[root@test day2]# echo $((10/10*10-2**4))
-6
[root@test day2]# echo $((10/10*(10-2)**4))
4096
4. let运算 不支持小数
以变量的方式做运算
[root@test day2]# let 1+1
[root@test day2]# let 1 + 1
-bash: let: +: syntax error: operand expected (error token is "+")
[root@test day2]# let a=10+10
[root@test day2]# echo $a
20
[root@test day2]# let a=10*10
[root@test day2]# echo $a
100
[root@test day2]# let a=10/10
[root@test day2]# echo $a
1
[root@test day2]# let i++
[root@test day2]# echo $i
1
[root@test day2]# #i++ ======== i=i+1
[root@test day2]# let i++
[root@test day2]# let i++
[root@test day2]# let i++
[root@test day2]# echo $i
4
[root@test day2]# unset i # 取消变量
[root@test day2]# let ++i
[root@test day2]# let ++i
[root@test day2]# let ++i
[root@test day2]# echo $i
3
i++和++i的区别
直接做运算结果相同
有变量赋值情况下结果不同
i++ 先赋值在运算
++i 先运算在赋值
[root@test ~]# a=1
[root@test ~]# b=1
[root@test ~]# let c=a++
[root@test ~]# let d=++b
[root@test ~]# #let c=a++ c=a+1
[root@test ~]# #let d=++b d=1+b
[root@test ~]# echo $c
1
[root@test ~]# echo $d
2
5. bc 支持小数和整数运算
[root@test ~]# yum -y install bc
[root@test ~]# echo 1+1|bc
2
[root@test ~]# echo 10+1.5|bc
11.5
[root@test ~]# echo 10*1.5|bc
15.0
[root@test ~]# echo 10/3|bc
3
6. awk python
[root@test ~]# awk 'BEGIN{print 10/3}'
3.33333
[root@test ~]# awk 'BEGIN{print 10**3}'
1000
[root@test ~]# awk 'BEGIN{print 10**3.2}'
1584.89
[root@test ~]# awk 'BEGIN{print 10-3.2}'
6.8
[root@test ~]# awk 'BEGIN{print 10-3.2*100/3}'
-96.6667
[root@test ~]# echo 100 200|awk '{print $1*$2}'
20000
[root@test ~]# echo 100 200|awk '{print $1/$2}'
0.5
[root@test ~]# echo 100 200|awk '{print $1**$2}'
inf
[root@test ~]# echo 100 2|awk '{print $1**$2}'
10000
案例: 写一个脚本传参的方式做一个计算器 加减乘除
要求输出结果:
sh count.sh
输入两个数字: 100 20
判断两个数字是否为整数
100+20=
100-20=
100/20=
100*20=
三. 比较表达式:整数比较
语法结构:
判断比较两个数字大小
test 20 比较符 10
[ 整数1 比较符 整数2 ]
[ `命令` 比较符 整数 ]
比较符:
= -eq
> -gt
>= -ge
< -lt
<= -le
!= -ne
比较判断: 使用test 了解
[root@test ~]# test 20 -gt 10
[root@test ~]# echo $?
0
[root@test ~]# test 20 -gt 100
[root@test ~]# echo $?
1
[root@test ~]# test 20 -gt 10 && echo 成立 || echo 不成立
成立
[root@test ~]# test 10 -gt 10 && echo 成立 || echo 不成立
不成立
[root@test ~]# test 10 -eq 10 && echo 成立 || echo 不成立
成立
比较判断: 使用[] 掌握重点 整数两端必须有空格
[root@test ~]# [ 100 -gt 20 ]
[root@test ~]# [ 100 -gt 20]
-bash: [: missing `]'
[root@test ~]# [100 -gt 20 ]
-bash: [100: command not found
[root@test ~]# [ 100 -gt 20 ] && echo 成立 || echo 不成立
成立
[root@test ~]# [ 100 -gt 100 ] && echo 成立 || echo 不成立
不成立
[root@test ~]# [ 100 -ge 100 ] && echo 成立 || echo 不成立
成立
[root@test ~]# [ 1000 -ge 100 ] && echo 成立 || echo 不成立
成立
[root@test ~]# [ 1000 -ne 100 ] && echo 成立 || echo 不成立
成立
[root@test ~]# [ 1000 -le 100 ] && echo 成立 || echo 不成立
不成立
判断支持命令
[root@test ~]# grep bash /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@test ~]# grep bash /etc/passwd|wc -l
1
[root@test ~]# [ `grep bash /etc/passwd|wc -l` -eq 1 ] && echo 成立 || echo 不成立
成立
[root@test ~]# [ `grep bash /etc/passwd|wc -l` -ne 0 ] && echo 成立 || echo 不成立
成立
[root@test ~]# [ `grep bash /etc/passwd|wc -l` -gt 0 ] && echo 成立 || echo 不成立
成立
[root@test ~]# [ `grep bash /etc/passwd|wc -l` -gt 1 ] && echo 成立 || echo 不成立
不成立
案例: 使用read传参 输入两个整数 是否为整数做判断 然后比对两个数字的大小(禁止使用if)
案例: 取字母排行统计 取单词排行统计
[root@test ~]# grep '[a-Z]' /etc/passwd -o|sort |uniq -c|sort -rn|head
83 n
73 o
63 s
58 i
39 b
36 t
35 l
35 a
34 e
29 r
[root@test ~]# sed 's#[-:x/0-9 ]########g' /etc/passwd|grep '[a-Z]' -o
[root@test ~]# sed 's#[-:/0-9]# #g' /etc/passwd|xargs -n1|sort |uniq -c|sort -rn|head
23 sbin
21 x
17 nologin
7 var
5 bin
4 root
3 sync
3 spool
3 shutdown
3 mail
多整数比较
并且: -a and
或者: -o or
语法结构:
[ 整数1 比较符 整数2 并且 整数3 比较符 整数4 ]
[ 整数1 比较符 整数2 或者 整数3 比较符 整数4 ]
案例:
[root@test ~]# [ 100 -gt 20 -a 20 -eq 30 ] && echo 成立 || echo 不成立
不成立
[root@test ~]# [ 100 -gt 20 -a 20 -le 30 ] && echo 成立 || echo 不成立
成立
[root@test ~]# [ 100 -gt 20 -o 20 -eq 30 ] && echo 成立 || echo 不成立
成立
[root@test ~]# [ 100 -lt 20 -o 20 -eq 30 ] && echo 成立 || echo 不成立
不成立
[root@test day2]# cat env.sh
#!/bin/sh
read -p "Please Input name env: " name
read -p "Please Input age env: " age
expr 1 + $age &>/dev/null
[ $? -ne 0 ] && echo 请输入正确的年龄 && exit
if [ $age -gt 0 -a $age -lt 100 ];then
echo name: $name
echo age: $age
else
echo "不成立"
exit
fi
四.条件表达式: 文件判断
语法格式:
test -f /etc/hosts
[ 判断符 文件/目录/路径 ]
[ -f /etc/hosts ]
判断符号:
-f 文件存在则为真(文件为常规普通文件)
-d 目录存在则为真
-e 任意文件存在则为真
-r 文件可读为真
-w 文件可写为真
-x 文件可执行为真
! -f 取反
[root@test day2]# [ -f /etc/hosts ] && echo 文件存在 || echo 文件不存在
文件存在
[root@test day2]# [ -e /etc/hosts ] && echo 文件存在 || echo 文件不存在
文件存在
[root@test day2]# [ -f /etc/ ] && echo 文件存在 || echo 文件不存在
文件不存在
[root@test day2]# [ -d /etc/ ] && echo 文件存在 || echo 文件不存在
文件存在
[root@test day2]# [ -e /etc/ ] && echo 文件存在 || echo 文件不存在
文件存在
[root@test day2]# [ -r /etc/ ] && echo 文件存在 || echo 文件不存在
文件存在
[root@test day2]# [ -r /etc/hosts ] && echo 文件存在 || echo 文件不存在
文件存在
[root@test day2]# [ -x /etc/hosts ] && echo 文件存在 || echo 文件不存在
文件不存在
[root@test day2]# [ -f /etc/hosts -a -d /etc ] && echo ok || echo error
ok
[root@test day2]# [ -d /etc/hosts -a -d /etc ] && echo ok || echo error
error
[root@test day2]# [ -d /etc/hosts -o -d /etc ] && echo ok || echo error
ok
案例: 判断文件存在则执行
判断bashrc存在则执行
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
调用函数库
[root@test ~]# cat test.sh
hehe(){
echo test
}
hehe
[root@test ~]# sh test.sh
test
[root@test ~]# hehe
-bash: hehe: command not found
[root@test ~]# hehe
-bash: hehe: command not found
[root@test ~]# source test.sh
test
[root@test ~]# hehe
test
[root@test day2]# cat test.sh
#!/bin/bash
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
if [ -f $1 ];then
action "$1" /bin/true
else
action "$1" /bin/false
fi
[root@test day2]# sh test.sh /etc/hosts
/etc/hosts [ OK ]
[root@test day2]# sh test.sh /etc/hostssssss
/etc/hostssssss [FAILED]
[root@test day2]# sh test.sh /etc/
/etc/ [FAILED]
[root@test day2]# sh test.sh /etc/passwd
/etc/passwd [ OK ]
案例2: 判断目录是否存在 如果不存在则创建
[root@test day2]# [ -d oldboy ] || mkdir oldboy
[root@test day2]# ll
drwxr-xr-x 2 root root 6 Aug 2 11:20 oldboy
五.条件表达式:字符串比对
语法格式:
[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
-n 字符串不为0则为真
-z 字符串为0则为真
[root@test day2]# test=aaa
[root@test day2]# echo $test
aaa
[root@test day2]# [ -n $test ] && echo 成立
成立
[root@test day2]# test=""
[root@test day2]# [ -z $test ] && echo 成立
成立
案例: 用户输入的字符串为0则退出
[root@test day2]# cat env.sh
#!/bin/sh
read -p "Please Input name env: " name
[ -z $name ] && echo "必须输入名称" && exit
[root@test day2]# [ root = root ] && echo 成立|| echo 不成立
成立
[root@test day2]# [ root = roo ] && echo 成立|| echo 不成立
不成立
[root@test day2]# [ root != roo ] && echo 成立|| echo 不成立
成立
[root@test day2]# [ $name != roo ] && echo 成立|| echo 不成立
成立
[root@test day2]# [ $name = roo ] && echo 成立|| echo 不成立
不成立
[root@test day2]# echo $name
hehe
[root@test day2]# [ $name = hehe ] && echo 成立|| echo 不成立
成立
[root@test day2]# [ $name = roo -o $name = hehe ] && echo 成立|| echo 不成立
成立
正则匹配:
[root@test day2]# [[ root =~ ^ro ]] && echo 成立|| echo 不成立
成立
[root@test day2]#
[root@test day2]# [[ root =~ t$ ]] && echo 成立|| echo 不成立
成立
[root@test day2]# [[ root =~ [a-z]$ ]] && echo 成立|| echo 不成立
成立
[root@test day2]# [[ root =~ [0-9]$ ]] && echo 成立|| echo 不成立
不成立
[root@test day2]# [[ root1 =~ [0-9]$ ]] && echo 成立|| echo 不成立
成立
案例: 要求传参的名称必须为字母 不允许有数字
#!/bin/sh
read -p "Please Input name env: " name
[ -z $name ] && echo "必须输入名称" && exit
if [[ ! $name =~ [0-9] ]];then
echo $name
else
echo "必须为字母"
exit
fi
[root@test day2]# cat env.sh
#!/bin/sh
read -p "Please Input name env: " name
[ -z $name ] && echo "必须输入名称" && exit
if [[ $name =~ ^[a-Z]+$ ]];then
echo $name
else
echo "必须为字母"
exit
fi
[root@test day2]# cat env.sh
#!/bin/sh
read -p "Please Input name env: " name
[ -z $name ] && echo "必须输入名称" && exit
if [[ $name =~ ^[a-Z]+$ ]];then
echo $name
else
echo "必须为字母"
exit
fi
read -p "Please Input age env: " age
if [[ $age =~ ^[0-9]{2}$ ]];then
echo $age
else
echo "必须输入0-100之间的数字"
exit
fi
[root@test day2]# [[ old100 =~ [a-z] ]] && echo 成立 || echo 不成立
成立
[root@test day2]# [[ old100 =~ [a-z]$ ]] && echo 成立 || echo 不成立
不成立
[root@test day2]# [[ old100 =~ ^[a-z]$ ]] && echo 成立 || echo 不成立
不成立
[root@test day2]# [[ oldboy =~ ^[a-z]$ ]] && echo 成立 || echo 不成立
不成立
[root@test day2]# [[ o =~ ^[a-z]$ ]] && echo 成立 || echo 不成立
成立
[root@test day2]# [[ a =~ ^[a-z]$ ]] && echo 成立 || echo 不成立
成立
[root@test day2]# [[ oldboy =~ ^[a-z]+$ ]] && echo 成立 || echo 不成立
成立
[root@test day2]# [[ ol45dboy =~ ^[a-z]+$ ]] && echo 成立 || echo 不成立
不成立
案例:
1. 获取磁盘使用率
2. 获取到的值如果大于80则发送邮件告警 小于80则提示磁盘使用率正常 并输出当前的值
1. 获取内存使用率
2. 如果内存值大于80则提示内存使用异常输出当前值 小于80则提示内存使用正常 输出当前值
1. 获取Linux操作系统的以下信息 输出到屏幕:
ETH0ip地址
公网IP地址
系统版本
虚拟平台Virtualization
内核版本
主机名称
磁盘使用率
内存使用率
负载
网络是否正常
要求执行结果:
先定义变量
调用变量
sh os.sh
操作系统: eth0IP=10.0.0.7
公网IP地址: 221.218.210.53
系统版本: centos7
主机名称: shell
磁盘使用率: 11%
...
网络: 正常
小结:
1.脚本传参方式
直接传参 $1 $2
赋值传参 name=$1
read传参 read -p "提示" name
2.数值运算:
整数: expr $[] $(()) let bc
都支持: awk python
3.数值比较
test 了解
[ 整数1 比较符 整数2 ]
-eq
-ne
-lt
-le
-gt
-ge
多整数比较 -a -o
4.文件判断
[ 判断符 文件/目录 ]
-f
-d
-e
-r
-w
-x
案例 文件存在则执行
/etc/init.d/functions
5.字符串比对
-n 值不为0为真
-z 值为0则为真
[ root = root ]
[ root != root ]
6.正则匹配
[[ root =~ ^r ]]
[[ root =~ ^[0-9] ]]
[[ $name =~ ^[a-Z0-9]+$ ]]
判断是否为整数
判断传参的个数
判断传参参数的长度
expr
[[ $age = ^[0-9]+$ ]]
判断是否为空
[ -z $name ]