shell脚本100例、练习使⽤
1、编写hello world脚本
#!/bin/bash
echo"hello world"
2、通过位置变量创建linux系统账户和密码
#!/bin/bash
#$1是执⾏脚本第⼀个参数 $2是执⾏脚本第⼆个参数
useradd "$1"
echo"$2" | passwd --stdin "$1"
#测试脚本
[root@template-host sh1]# sh2.sh aaa 123
Changing password for user aaa.
passwd: all authentication tokens updated successfully.
#测试登录
[root@template-host sh1]# su - aaa
[aaa@template-host ~]$
3、每周五使⽤tar命令备份 /var/log下的所有⽇志⽂件
#!/bin/bash
tar -czPf log-`date +%y%m%d`. /var/log    #加P是因为如果不加会出现错误:tar: Removing leading `/' from member names    date和+之间注意有空格。修改系统参数
[root@template-host sh1]# crontab -e
00 03 * * 5 /data/sh1/3.sh
4、⼀键部署LNMP(RPM包版本
#!/bin/bash
#此脚本需要提前配置yum源,否则⽆法配置成功。本脚本使⽤于7.4
yum -y install httpd
yum -y install mariadb mariadb-devel mariadb-server
yum -y install php php-mysql
systemctl start httpd mariadb  #启动httpd、mariadb
systemctl enable httpd mariadb #加⼊开机⾃启动
systemctl status httpd mariadb #查看是否成功
5、实时监控本机硬盘内存剩余空间,剩余内存空间⼩于500M,根分区剩余空间⼩于1000M时,发送警报信息到命令⾏
#!bin/bash
#提取分区剩余空间单位:kb
pg one 万磁王disk_size=$(df / | awk'/\//{print $4}')
#提取内存空间单位M
mem_size=$(free -m | awk'/Mem/{print $4}')
while :
do
if [ $disk_size -le 512000 -o $mem_size -le 1024 ];then
echo"警报:资源不⾜"
sleep5
fi
done
6、随机⽣成⼀个100以内的随机数,提⽰⽤户猜数字,提⽰⽤户猜⼤了、猜⼩了、猜对了,直⾄⽤户猜对,脚本结束。
#!bin/bash
#RANDOM为系统⾃带的系统变量,值为0-32767的随机数
#使⽤取余算法将随机数变为1-100的随机数
end=100
out=101
num=$[random%100+1]
while :
do
read -p "请输⼊1-100随机数:" input
if [ $input -ge $out ];then
echo"范围错误,拜拜"
exit
elif [ $input -eq $num ];then
echo"恭喜你,猜对了"
exit
elif [ $input -gt $num ];then
echo"猜⼤了"
elif [ $input -lt $num ];then
echo"猜⼩了"
fi
done
echo"随机数为:"$num
7、检测当前账户是否为超级管理员,如果是管理员,则使⽤yum安装vsftpd,如果不是,则提⽰您⾮管理员(使⽤字串对⽐版本、UID版本两个版本)
#!bin/bash
#字串对⽐版本
if [ $USER == "root" ];then
yum install vsftpd
else
echo"您不是管理员,没有权限安装软件"
fi
#!bin/bash
#UID对⽐版本
if [ $UID -eq 0 ];then
yum install vsftpd
else
echo"您不是管理员,没有权限安装软件"
fi
8、提⽰⽤户输⼊⽤户名和密码,脚本⾃动创建相应的账户及配置密码。如果⽤户不输⼊⽤户名,则提⽰必须输⼊⽤户名并推出脚本;如果⽤户不输⼊密码,则使⽤统⼀的mim123456作为默认密码
1 #!bin/bash
2 read -p "请输⼊⽤户名:" user
3if [ -z $user ];then
4echo"您未输⼊⽤户名"
5        exit
6fi
7 #使⽤stty -echo关闭shell的回显功能
8 #使⽤stty echo打开shell的回显功能
9 stty echo
10 read -p "请输⼊密码:" pass
11 stty  -echo
12 pass=${pass:-123456}
13 useradd "$user"
14echo"$pass" | passwd --stdin "$user"
9、以此提⽰⽤户输⼊3个整数,脚本根据数据⼤⼩依次排序输出三个数字
1 #!bin/bash
2 read -p "请输⼊⼀个整数:" num1
3 read -p "请输⼊⼀个整数:" num2
4 read -p "请输⼊⼀个整数:" num3
5 #不管谁⼤谁下,最后都打印num1、num2、num3
6 #num1永远存最⼩的值,num2存中间值、num3存最⼤值
7 tmp=0
8 #如果num1⼤于num2,则对调num1和num2的值,确保num1中是最⼩的值
9if [ $num1 -gt $num2 ];then
10        tmp=$num1
11        num1=$num2
12        num2=$tmp
13fi
14if [ $num2 -gt $num3 ];then
15        tmp=$num2
16        num2=$num3
17        num3=$tmp
18fi
19echo"从⼩到⼤的顺序为:"$num1,$num2,$num3
10、编写脚本,实现(⽯头、剪⼑、布)游戏。
#!bin/bash
2 game=(⽯头剪⼑布)
3 num=$[RANDOM%3]
4 computer=${game[$num]}
5 #通过随机数获取计算机的出拳,出拳的可能性保存在⼀个数组中,game[0],game[1],game[2]分别为三种不
通的可能
6echo"请根据下列提⽰出拳:"
体操比赛作文7echo"1.⽯头"
8echo"2.剪⼑"
9echo"3.布"
10 read -p "请输⼊1-3:" person
11case $person in
121)
13if [ $num -eq 0 ];then
14echo"平局"
15elif [ $num -eq 1 ];then
16echo"你赢了"
17else
18echo"计算机赢"
19fi;;
202)
21if [ $num -eq 0 ];then
22echo"计算机赢"
23elif [ $num -eq 1 ];then
24echo"平局"
25else
26echo"你赢了"
27fi;;
283)
29if [ $num -eq 0 ];then
30echo"你赢了"
31elif [ $num -eq 1 ];then
32echo"计算机赢"
33else
34echo"平局"
35fi;;
36 *)
37echo"必须输⼊1-3的数字"
38esac
11、编写脚本测试172.16.1.0/24整个⽹段中那些主机处于开机状态,那些主机处于关机状态(for版本、while版本、多进程版本)
1 #!bin/bash
2 #for i in {1..254}
3 #do
4 #      ping -c2 -i0.3 -W1 172.16.1.$i &>/dev/null
5 #      if [ $? -eq 0 ];then
6 #              echo"172.16.1.$i" is up
7 #      else
8 #              echo"172.16.1.$i" is down
9 #      fi
10 #done
11
12 #!bin/bash
13 #i=1
14 #while [ $i -le 254 ]
15 #do
16 #      ping -c2 -i0.3 -W1 172.16.1.$i &>/dev/null
17 #      if [ $? -eq 0 ];then
18 #              echo"172.16.1.$i" is up
19 #      else
20 #              echo"172.16.1.$i" is down
21 #      fi
22 #      let i++
23 #done
24
25 #!bin/bash
26 #定义⼀个函数,ping某⼀台主机,并检测主机的存活状态
27 myping(){
28ping -c2 -i0.3 -W1 $1 &>/dev/null
29if [ $? -eq 0 ];then
30echo"$1" is up
31else
32echo"$1" is down
33fi
34 }
35for i in {1..254}
36do
37        myping 172.16.1.$i &
38done
39 #使⽤&符号,将执⾏的函数放在后台执⾏,这样做的好处是不需要等待ping第⼀台主机的回应,就可以继续并发ping第⼆台主机,以此类推。
12、编写脚本,显⽰进度条
1 #!bin/bash
2 jindu(){
3while :
4do
5echo -n "#"
6sleep0.1
7done
8 }
9 jindu &
10cp -r $1 $2
11kill  $!
12echo"拷贝完成"
13、9*9乘法表
1 #!bin/bash
欧服2for i in `seq9`
3do
4for j in `seq $i`
5do
6echo -n "$i*$j=$[i*j] "
7done
8echo
9done
14、使⽤死循环实时显⽰eth0⽹卡发送的数据包的流量
1 #!bin/bash
2while :
3do
4echo"本地⽹卡eth0流量信息如下:"
5ifconfig eth0 | grep"RX pack" | awk'{print $5}'
6ifconfig eth0 | grep"TX pack" | awk'{print $5}'
7sleep1
8done
15、使⽤名单,在计算机中⾃动创建对应的账户并设置初始密码
1 #!bin/bash
杨帆个人资料简介及
2for i in ``
3do
4        useradd $i
5echo"123456" | passwd --stdin $i
6done
16、⼀键部署LNMP(源码安装版本)
17、查看有多少个远程ip在远程本机
#!/bin/bash
#使⽤netstat -atn 可以查看本机所有连接的状态,-a查看所有,-t 仅显⽰tcp连接的信息,-n数字格式显⽰#Local Address (第四列是本机的IP和端⼝信息)
#Foreign Address(第五列是远程主机的IP和端⼝信息)
#使⽤awk命令仅显⽰第5列数据,再显⽰第1列IP地址的信息
李若彤复出#sort可以按数字⼤⼩排序,最后使⽤uniq将多余重复的删除并统计重复的次数
#-F ⽂件中的Foreign Address是以:作为分隔的
netstat -atn | awk'{print $5}' | awk -F: '{print $1}' | sort -nr | uniq -c
18、对100以内的所有正整数相加求和(1-00)
1 #!bin/bash
2 tmp=0
3for i in `seq100`
4do
5        tmp=$[i+tmp]
6done
7echo"总和是:$tmp"
19、打印国际象棋棋盘
1 #!bin/bash
2 #设置两个变量,i和j,⼀个代表⾏,⼀个代表列,国际象棋为8*8棋盘
3
4 #i=1是代表打印第⼀⾏棋盘,第⼀⾏棋盘有灰⾊和蓝⾊间隔输出,总共为8列
5
6 #i=1,j=1代表第⼀⾏第⼀列;i=2,j=3代表第⼆⾏第三列
7
8 #棋盘的规律是i+j如果是偶数,就打印蓝⾊⾊块,如果是奇数就打印灰⾊⾊块
9
10 #使⽤echo -ne打印⾊块,并且打印完成⾊块后不⾃动换⾏,在同⼀⾏继续输出其他⾊块
11for i in {1..8}
12do
13for j in {1..8}
14do
15sum=$[i+j]
16if [ $[sum%2] -eq 0 ];then
17echo -ne "\033[46m \033[0m"
18else
19echo -ne "\033[47m \033[0m"
20fi
21done
22echo
23done
20、统计每个远程ip访问了本机apache⼏次?
1 #!/bin/bash
2
3awk'{ip[$1]++}END{for(i in ip){print ip[i],i}}' /var/log/httpd/access_log
4
5 #$1是第⼀⾏的IP地址
6
7 #ip[$1]++产⽣⼀个以IP地址为下标的数组,每当IP地址出现⼀次就给值加⼀
8
9 #awk会逐⾏处理⽂件来产⽣⼀个数组
10
11 #END后会遍历并打印数组下标和数组的值,从⽽达到统计的效果
21、统计当前linux系统可以登录计算机的账户有多少个?
#!bin/bash
grep"bash$" /etc/passwd | wc -l
22、nginx启动脚本
#!bin/bash
#本脚本编写完成后,放置在/etc/init.d⽬录下,就可以被Linux系统⾃动识别到改脚本#如果本脚本名为/etc/init.d/nginx,则service nginx start就可以启动该服务program=/data/nginx/sbin/nginx
pid=/data/nginx/logs/nginx.pid
start(){
if [ -f $pid ];then
echo"nginx服务已经处于开启状态"
else
$program
echo"nginx服务启动成功"
fi
}
stop(){
if [  -f $pid ];then
$program -s stop
怎样可以缓解痛经echo"关闭服务完成"
else
echo"nginx服务已经关闭"
fi
}
status(){
if [ -f $pid ];then
echo"服务正在运⾏"
else
echo"服务已经关闭"
fi
}
case $1in
start)
start;;
stop)
stop;;
status)
status;;
*)
echo"输⼊格式语法错误"
esac
23、切割nginx⽇志⽂件
#!bin/bash
#!/bin/bash
#
#********************************************************************
#[Author]:      NPC
#[Date]:        2021-07-22
#[Description]:  Nginx Logs split
#********************************************************************
LOGS_PATH=/data/nginx/logs