Centos7笔记之shell脚本初步练习

一、目标

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的一个老师。

你可能感兴趣的:(Linux)