一、目标
centos7的shell脚本变成初步练习
shell脚本的注意事项:
1.开头必须写解释器 #!/bin/bash
2.语法锁紧使用四个空格
3.命名规则:变量名大写,函数名小写,命名需要有一定的意义,
4.默认变量是全局的,在函数中local指定为局部变量
5.等号右边的变量必须写$符号
6.定义变量等号两边均不能有空格
7.想执行系统命令在shell中,那么可以用反引号括起来``
二、平台
centos7.6
三、命令练习
1.第一个shell程序
[root@localhost mycode]# ./hello.sh
hello world!~ kahn
Thu Aug 15 06:46:04 PDT 2019
[root@localhost mycode]#
[root@localhost mycode]# cat hello.sh
#!/bin/bash
# #第一个shell程序
echo hello world!~ kahn
echo $(date)
[root@localhost mycode]#
2.第二个shell程序练习
#!/bin/bash
echo "---------------------------------------------------------"
echo "显示CPU信息"
echo $(cat /proc/cpuinfo | grep 'model name')
echo "---------------------------------------------------------"
echo "显示系统负载情况"
echo $(uptime)
echo "---------------------------------------------------------"
echo "显示交换分区swap的情况"
echo $(free | grep wap)
echo "---------------------------------------------------------"
echo "显示系统挂载点信息"
echo $(df -hT | grep 'boot')
echo "---------------------------------------------------------"
echo "显示网卡信息"
echo $(ip addr show ens33 | grep "inet ")
echo "---------------------------------------------------------"
3.带变量的shell
[root@localhost mycode]# cat p003.sh
#!/bin/bash
# #这个程序用来练习变量的。
echo "我有$18美元,前面的本意是显示18美元"
echo "这个才是真正的显示\$18美元。加了个转义字符\ "
xUser='kahn'
age=18
echo "hi everyone ,my name is $xUser, i am $age years old!"
xUser="xia"
echo "hello ladys and gentlemens, i am $xUser "
[root@localhost mycode]#
[root@localhost mycode]#
[root@localhost mycode]# ./p003.sh
我有8美元,前面的本意是显示18美元
这个才是真正的显示$18美元。加了个转义字符\
hi everyone ,my name is kahn, i am 18 years old!
hello ladys and gentlemens, i am xia
4.反引号的作用``,即shift+Tab键
[root@localhost mycode]# cat p004.sh
#!/bin/bash
#反引号的作用``
xTime=`date`
echo $xTime
[root@localhost mycode]# ./p004.sh
Thu Aug 15 07:39:03 PDT 2019
[root@localhost mycode]#
5.shell做数学运算
[root@localhost mycode]# cat p005.sh
#!/bin/bash
#做数学运算
var1=100
var2=5
var3=`expr $var1 / $var2`
echo Result= $var3
[root@localhost mycode]# ./p005.sh
Result= 20
[root@localhost mycode]#
6.shell做数学运算2
[root@localhost mycode]# cat p006.sh
#!/bin/bash
#shell做数学运算2
var1=2
var2=10
var3=6
var4=$[$var1*($var2-$var3)]
echo result=$var4
[root@localhost mycode]# ./p006.sh
result=8
[root@localhost mycode]#
7.shell的if判断语句1
[root@localhost mycode]# cat p007.sh
#!/bin/bash
# if判断语句的练习
read -p "请输入你的密码(xPWD是接收参数)" xPWD
if [ "$xPWD" == "37213690" ]
then
echo "密码输入对咯"
else
echo "密码输入错误"
fi
[root@localhost mycode]# source p007.sh
请输入你的密码(xPWD是接收参数)fewa^H^H
密码输入错误
[root@localhost mycode]# source p007.sh
请输入你的密码(xPWD是接收参数)37213690
密码输入对咯
[root@localhost mycode]#
8.shell的if判断语句2
[root@localhost mycode]# cat p008.sh
#!/bin/bash
#判断当前用户是否是root用户登录的,如果是则执行备份操作
if [ "$(id -u)" -eq "0" ]
then
tar -czvf /home/kahn/etc.tar.gz /etc &> /dev/null
echo "备份成功了"
else
echo "备份失败了"
fi
[root@localhost mycode]# source p008.sh
备份成功了
9.shell的if判断语句3
[root@localhost mycode]# cat p010.sh
#!/bin/bash
#成绩判断的小脚本
if [ $1 -ge 101 ];then
echo "成绩不能超过100"
elif [ $1 -ge 90 ];then
echo "你是优秀的程序大于了90"
elif [ $1 -ge 80 ];then
echo "你的成绩良好大于80,请继续努力"
elif [ $1 -ge 60 ];then
echo "你是成绩合格,以后需要更加努力了"
elif [ $1 -eq 100 ];then
echo "满分哦朋友,侬结棍"
else
echo "天生我材必有用60啊"
fi
[root@localhost mycode]# ./p010.sh 100
你是优秀的程序大于了90
[root@localhost mycode]# ./p010.sh 99
你是优秀的程序大于了90
[root@localhost mycode]# ./p010.sh 81
你的成绩良好大于80,请继续努力
[root@localhost mycode]# ./p010.sh 50
天生我材必有用60啊
[root@localhost mycode]#
10.使用case判断日期进行备份数据
[root@localhost mycode]# cat p011.sh
#!/bin/bash
#周六或周一备份数据
DATE=$(date +%a)
TIME=$(date +%Y%m+%d)
case $DATE in Mon | Sat)
tar -czvf /home/kahn/${TIME}_bak.tar.gz /etc &> /dev/null
echo "${TIME}数据备份成功"
;;
*)
echo "备份失败,日期未到。因为今天是${DATE}"
esac
[root@localhost mycode]# source p011.sh
201908+17数据备份成功
[root@localhost mycode]#
11.用case判断用户输入的是什么
[root@localhost mycode]# cat p012.sh
#!/bin/bash
#case判断输入的是不是数字
case $1 in
[a-z]|[A-Z])
echo "恁输入里是字母:$1"
;;
[[:digit:]])
echo "你输入的是数字:$1"
;;
*)
echo "你输入的是坨便便"
esac
[root@localhost mycode]# ./p012.sh
你输入的是坨便便
[root@localhost mycode]# ./p012.sh 11
你输入的是坨便便
[root@localhost mycode]# ./p012.sh 1
你输入的是数字:1
[root@localhost mycode]# ./p012.sh k
恁输入里是字母:k
[root@localhost mycode]#
12.for循环发送邮件(功能可能有问题,仅展示for的用法)
[root@localhost mycode]# chmod u+x p013.sh
[root@localhost mycode]#
[root@localhost mycode]# ./p013.sh
./p013.sh: line 6: /var/log/kahn_runLog: No such file or directory
将邮件陈工发送给了:kahn
./p013.sh: line 6: /var/log/kahn_runLog: No such file or directory
将邮件陈工发送给了:xia
./p013.sh: line 6: /var/log/kahn_runLog: No such file or directory
将邮件陈工发送给了:serena
./p013.sh: line 6: /var/log/kahn_runLog: No such file or directory
将邮件陈工发送给了:baobao
[root@localhost mycode]#
13.用for循环做九九乘法表1
[root@localhost mycode]# cat p014.sh
#!/bin/bash
#九九乘法表
for i in {1..9}
do
for j in {1..9}
do
printf "%-8s" "$i*$j"
done
echo
done
[root@localhost mycode]#
[root@localhost mycode]# source p014.sh
1*1 1*2 1*3 1*4 1*5 1*6 1*7 1*8 1*9
2*1 2*2 2*3 2*4 2*5 2*6 2*7 2*8 2*9
3*1 3*2 3*3 3*4 3*5 3*6 3*7 3*8 3*9
4*1 4*2 4*3 4*4 4*5 4*6 4*7 4*8 4*9
5*1 5*2 5*3 5*4 5*5 5*6 5*7 5*8 5*9
6*1 6*2 6*3 6*4 6*5 6*6 6*7 6*8 6*9
7*1 7*2 7*3 7*4 7*5 7*6 7*7 7*8 7*9
8*1 8*2 8*3 8*4 8*5 8*6 8*7 8*8 8*9
9*1 9*2 9*3 9*4 9*5 9*6 9*7 9*8 9*9
[root@localhost mycode]#
14.用for循环做九九乘法表2
[root@localhost mycode]# cat p014.sh
#!/bin/bash
#九九乘法表
for i in {1..9}
do
for ((j=1;j<=i;j++))
do
printf "%-8s" "$i*$j"
done
echo
done
[root@localhost mycode]# source p014.sh
1*1
2*1 2*2
3*1 3*2 3*3
4*1 4*2 4*3 4*4
5*1 5*2 5*3 5*4 5*5
6*1 6*2 6*3 6*4 6*5 6*6
7*1 7*2 7*3 7*4 7*5 7*6 7*7
8*1 8*2 8*3 8*4 8*5 8*6 8*7 8*8
9*1 9*2 9*3 9*4 9*5 9*6 9*7 9*8 9*9
[root@localhost mycode]#
15.用for循环做九九乘法表3
[root@localhost mycode]# cat p014.sh
#!/bin/bash
#九九乘法表
for i in {1..9}
do
for ((j=1;j<=i;j++))
do
printf "%-8s" $j*$i=$((j*i))
done
echo
done
[root@localhost mycode]# source p014.sh
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
[root@localhost mycode]#
16.用while批量添加用户
[root@localhost mycode]# cat p015.sh
#!/bin/bash
#批量增加用户
NUM=1
while [ $NUM -le 20 ]
do
userdel -r xUser${NUM}
useradd xUser${NUM}
ID=`id xUser${NUM}`
echo xUser${NUM}"用户的UID是"${ID}
echo xUser${NUM}"创建成功"
NUM=$((NUM+1))
done
[root@localhost mycode]# ./p015.sh
xUser1用户的UID是uid=1022(xUser1) gid=1022(xUser1) groups=1022(xUser1)
xUser1创建成功
xUser2用户的UID是uid=1023(xUser2) gid=1023(xUser2) groups=1023(xUser2)
xUser2创建成功
xUser3用户的UID是uid=1024(xUser3) gid=1024(xUser3) groups=1024(xUser3)
xUser3创建成功
。。。。。
xUser20用户的UID是uid=1041(xUser20) gid=1041(xUser20) groups=1041(xUser20)
xUser20创建成功
[root@localhost mycode]#
17.用while做一个菜单
[root@localhost mycode]# cat p016.sh
#!/bin/bash
#用while循环做菜单
while true
do
clear
echo "-----------------------------------------------------"
echo "1.看CPU信息"
echo "2.看系统负载信息"
echo "3.看内存信息"
echo "4.看系统挂载信息"
echo "5.退出本程序"
echo "-----------------------------------------------------"
read -p "请输入要操作编号(1-5)" userSelect
case $userSelect in
1)
echo $(cat /proc/cpuinfo | grep "model name")
read -p "请继续选择你要操作的条目数:"
;;
2)
echo $(uptime)
read -p "请继续选择你要操作的条目数:"
;;
3)
echo $(free)
read -p "请继续选择你要操作的条目数:"
;;
4)
echo $(df -hT)
read -p "请继续选择你要操作的条目数:"
;;
5)
exit 0
;;
*)
read -p "请继续选择你要操作的条目数:"
esac
done
[root@localhost mycode]#
18.用until批量删除用户
[root@localhost mycode]# cat p017.sh
#!/bin/bash
#使用until批量删除用户
a=20
until [ $a -eq 0 ]
do
userdel -r xUser${a}
echo "user xUser${a} deleted!"
a=$((a-1))
done
19.用select做选择
[root@localhost mycode]# cat p018-select.sh
#!/bin/bash
#select语句练习
echo "Where r u from ?"
select var in 'sh' 'bj' 'zz' 'zmd' 'LH' 'gz'
do
break
done
echo "u r form $var"
[root@localhost mycode]# ./p018-select.sh
Where r u from ?
1) sh
2) bj
3) zz
4) zmd
5) LH
6) gz
#? 1
u r form sh
[root@localhost mycode]#
20.控制语句break和continue的使用
[root@localhost mycode]# cat p020-continue-break.sh
#!/bin/bash
#这个是测试continue和break的语句
for num in {1..20}
do
case $num in
1)
continue
;;
18)
break
;;
esac
echo ${num}
done
sleep 3
exit
echo "这里的echo肯定打印不出来了"
[root@localhost mycode]# ./p020-continue-break.sh
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost mycode]#
21.用shell写自定义函数(方法)
[root@localhost mycode]# cat p021-function.sh
#!/bin/bash
#自定义函数的练习
#方法:打印提示符
Hint() {
read -p "请按回车继续:"
}
#方法:查看cpu信息kahn
Display_CpuInfo() {
echo
echo -e "\033[4;31mDisplay the CPU info:\033[0m"
cat /proc/cpuinfo | grep "model name"
cat /proc/cpuinfo | grep "cpu cores"
#下面这一行是看cpu是否支持虚拟化
grep -Eq "svm|vmx" /proc/cpuinfo && echo"CPU Virtualiztion:Support" || echo "CPU Virtualiztion: No Support"
}
#方法:查看系统负载
Display_LoadInfo() {
echo
echo -e "\033[4;31mKahn Display system load info:\033[0m"
echo "现在时间:`uptime | awk 'BEGIN{FS=","}{print $1}' | awk 'BEGIN{FS=" "}{print $1}'`"
echo "持续开机:`uptime | awk 'BEGIN{FS=","}{print $1}' | awk 'BEGIN{FS=" "}{print $3}'`"
}
#方法:查看内存信息
Display_MemoryInfo() {
echo -e "\033[4;31mDisplay memory info:\033[0m"
free
}
#方法:查看磁盘挂载信息
Display_DiskInfo() {
echo -e "\033[4;31mDisplay disk info:\033[0m"
df -hT
}
#用while循环做菜单
while true
do
clear
echo "-----------------------------------------------------"
echo "1.看CPU信息"
echo "2.看系统负载信息"
echo "3.看内存信息"
echo "4.看系统挂载信息"
echo "5.退出本程序"
echo "-----------------------------------------------------"
read -p "请输入要操作编号(1-5)" userSelect
case $userSelect in
1)
Display_CpuInfo
Hint
;;
2)
Display_LoadInfo
Hint
;;
3)
Display_MemoryInfo
Hint
;;
4)
Display_DiskInfo
Hint
;;
5)
break
;;
*)
read -p "请继续选择你要操作的条目数:"
esac
done
[root@localhost mycode]#
22.判断用户输入的密码是否正确,最大不允许超过3次
[root@localhost mycode]# cat p022-CheckPassword.sh
#!/bin/bash
#检测用户输入的密码,最大输入3次
xPwd="kahn37213690" #定义密码
x=0 #定义计数器
while true
do
read -p "Type your password pls!" inputPWD #读取用户输入的密码
x=$((x+1)) #计数器加1
if [ $inputPWD == $xPwd ];then
echo "密码输入正确了,恭喜你!"
break
elif [ $x -lt 3 ];then
continue
else
echo "你输入的密码错误,已经超过3次了,退出."
break
fi
done
[root@localhost mycode]# ./p022-CheckPassword.sh
Type your password pls!1
Type your password pls!2
Type your password pls!3
你输入的密码错误,已经超过3次了,退出.
[root@localhost mycode]# ./p022-CheckPassword.sh
Type your password pls!kahn37213690
密码输入正确了,恭喜你!
[root@localhost mycode]#
23.使用脚本监测服务器是否在线1
[root@localhost mycode]# cat p023-CheckOnlineStatus.sh
#!/bin/bash
#使用shell脚本检测服务器是否在线
ipList="223.5.5.5 192.168.0.1 127.0.0.1 10.100.100.210"
for ip in $ipList;do
num=1
while [ $num -le 3 ];do
if ping -c 1 $ip >/dev/null;then
echo "$ip ping is success"
break
else
echo "$ip ping is fail $num"
failCount[$num]=$ip
let num++
fi
done
#对失败3次的ip进行处理
if [ ${#failCount[*]} -eq 3 ];then
echo "${failCount[1]} Ping is fail"
unset failCount[*]
fi
done
24.使用脚本监测服务器是否在线2
[root@localhost mycode]# cat p024-ChenkOnlineStatus-v2.sh
#!/bin/bash
#shell脚本检测服务器是否在线
ipList="223.5.5.5 192.168.0.1 127.0.0.1 10.100.100.210"
for ip in $ipList;do
failCount=0
for ((i=1;i<=3;i++));do
if ping -c 1 $ip > /dev/null;then
echo "$ip ping is success!"
break
else
echo "$ip ping is fail $i"
let failCount++
fi
done
if [ $failCount -eq 3 ];then
echo "ping 这玩意真失败了$ip"
fi
done
[root@localhost mycode]# source p024-ChenkOnlineStatus-v2.sh
223.5.5.5 ping is success!
192.168.0.1 ping is fail 1
192.168.0.1 ping is fail 2
192.168.0.1 ping is fail 3
ping 这玩意真失败了192.168.0.1
127.0.0.1 ping is success!
10.100.100.210 ping is success!
[root@localhost mycode]#
25.linux用shell脚本判断字符串是否是ipV4地址1
[root@localhost mycode]# cat p025-isIpv4Address.sh
#!/bin/bash
#判断ip地址是否是ip v4.
function isIPv4 {
ip=$1
valid_check=$(echo $ip|awk -F. '$1<=255&&$2<=255&&$3<=255&&$4<=255&&$1!=0{print "YES"}')
if echo $ip | grep -E "^[0-9]{1,3}\.[0-9{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" >/dev/null;then
if [ $valid_check == "YES" ];then
echo "$ip is IPv4 address!"
else
echo "$ip 这不是个ipv4地址"
fi
else
echo "$ip 格式错误。。。"
fi
}
isIPv4 127.0.0.1
isIPv4 223.5.5.5
isIPv4 a.b.c.d
isIPv4 1.a.3.b
isIPv4 kahn.xiao
isIPv4 i love sh!
isIPv4 0.11.22.33
isIPv4 255.255.255.0
[root@localhost mycode]# . p025-isIpv4Address.sh
127.0.0.1 is IPv4 address!
223.5.5.5 is IPv4 address!
a.b.c.d 格式错误。。。
1.a.3.b 格式错误。。。
kahn.xiao 格式错误。。。
i 格式错误。。。
0.11.22.33 格式错误。。。
255.255.255.0 格式错误。。。
[root@localhost mycode]#
26.linux用shell脚本判断字符串是否是ipV4地址2
[root@localhost mycode]# cat p026-isIpv4Address.sh
#!/bin/bash
#判断ip地址是否是ip v4.
function isIPv4 {
ip=$1
valid_check=$(echo $ip|awk -F. '$1<=255&&$2<=255&&$3<=255&&$4<=255&&$1!=0{print "YES"}')
if echo $ip | grep -E "^[0-9]{1,3}\.[0-9{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" >/dev/null;then
if [ $valid_check == "YES" ];then
echo "$ip is IPv4 address!"
return 0 #成功返回0
else
echo "$ip 这不是个ipv4地址"
return 1 #失败返回1
fi
else
echo "$ip 格式错误。。。"
return 1 #失败返回1
fi
}
while true;do
read -p "请输入一个ip地址:" ipaddress
isIPv4 $ipaddress
[ $? -eq 0 ] && break || continue #一直判断输入的是不是ip,如果是就退出。不是就一直让输入ip
done
[root@localhost mycode]# source p026-isIpv4Address.sh
请输入一个ip地址:1.1.1.1
1.1.1.1 is IPv4 address!
[root@localhost mycode]# source p026-isIpv4Address.sh
请输入一个ip地址:a.b.c.1
a.b.c.1 格式错误。。。
请输入一个ip地址:0.1.2.2
-bash: [: ==: unary operator expected
0.1.2.2 这不是个ipv4地址
请输入一个ip地址:a
a 格式错误。。。
请输入一个ip地址:223.5.5.5
223.5.5.5 is IPv4 address!
[root@localhost mycode]#
27.听说是一个shell脚本考试题,根据输入的内容返回相应的内容
[root@localhost mycode]# chmod u+x p027-panduan.sh
[root@localhost mycode]#
[root@localhost mycode]# ./p027-panduan.sh
/root/foo.sh redhat|fedora
[root@localhost mycode]# ./p027-panduan.sh redhat
fedora
[root@localhost mycode]# ./p027-panduan.sh fedora
redhat
[root@localhost mycode]# cat p027-panduan.sh
#!/bin/bash
#根据参数内容输入相应的内容的判断语句
case $1 in
fedora)
echo "redhat"
;;
redhat)
echo "fedora"
;;
*)
echo "/root/foo.sh redhat|fedora"
esac
[root@localhost mycode]#
四、执行shell脚本的几种方法
1.给脚本赋予可执行权限 chmod u+x kahn.sh ##相当于给系统开个子进程让它运行。
2.没有权限,则通过bash或sh运行: bash kahn.sh 或者sh kahn.sh ##这种方法的好处是shell脚本中可以不用写第一行的解释器
3.没有权限,通过source或者. 运行: source kahn.sh 或 . kahn.sh ##脚本在当前的shell环境下运行
kahn 2019年8月18日22:45:00,课程学自TLXY的一个老师。