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]# sh 2.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`.tar.gz /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
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 "警报:资源不足"
sleep 5
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
  3 if [ -z $user ];then
  4         echo "您未输入用户名"
  5         exit
  6 fi
  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"
 14 echo "$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中是最小的值
  9 if [ $num1 -gt $num2 ];then
 10         tmp=$num1
 11         num1=$num2
 12         num2=$tmp
 13 fi
 14 if [ $num2 -gt $num3 ];then
 15         tmp=$num2
 16         num2=$num3
 17         num3=$tmp
 18 fi
 19 echo "从小到大的顺序为:"$num1,$num2,$num3

10、编写脚本,实现(石头、剪刀、布)游戏。

#!bin/bash
  2 game=(石头 剪刀 布)
  3 num=$[RANDOM%3]
  4 computer=${game[$num]}
  5 #通过随机数获取计算机的出拳,出拳的可能性保存在一个数组中,game[0],game[1],game[2]分别为三种不
    通的可能
  6 echo "请根据下列提示出拳:"
  7 echo "1.石头"
  8 echo "2.剪刀"
  9 echo "3.布"
 10 read -p "请输入1-3:" person
 11 case $person in
 12 1)
 13 if [ $num -eq 0 ];then
 14         echo "平局"
 15 elif [ $num -eq 1 ];then
 16         echo "你赢了"
 17 else
 18         echo "计算机赢"
 19 fi;;
 20 2)
 21 if [ $num -eq 0 ];then
 22         echo "计算机赢"
 23 elif [ $num -eq 1 ];then
 24         echo "平局"
 25 else
 26         echo "你赢了"
 27 fi;;
 28 3)
 29 if [ $num -eq 0 ];then
 30         echo "你赢了"
 31 elif [ $num -eq 1 ];then
 32         echo "计算机赢"
 33 else
 34         echo "平局"
 35 fi;;
 36 *)
 37         echo "必须输入1-3的数字"
 38 esac

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(){
 28         ping -c2 -i0.3 -W1 $1 &>/dev/null
 29         if [ $? -eq 0 ];then
 30                 echo "$1" is up
 31         else
 32                 echo "$1" is down
 33         fi
 34 }
 35 for i in {1..254}
 36 do
 37         myping 172.16.1.$i &
 38 done
 39 #使用&符号,将执行的函数放在后台执行,这样做的好处是不需要等待ping第一台主机的回应,就可以继续并发ping第二台主机,以此类推。

12、编写脚本,显示进度条

  1 #!bin/bash
  2 jindu(){
  3 while :
  4 do
  5         echo -n "#"
  6         sleep 0.1
  7 done
  8 }
  9 jindu &
 10 cp -r $1 $2
 11 kill  $!
 12 echo "拷贝完成"

13、9*9乘法表

  1 #!bin/bash
  2 for i in `seq 9`
  3 do
  4         for j in `seq $i`
  5         do
  6                 echo -n "$i*$j=$[i*j] "
  7         done
  8         echo
  9 done

 14、使用死循环实时显示eth0网卡发送的数据包的流量

  1 #!bin/bash
  2 while :
  3 do
  4         echo "本地网卡eth0流量信息如下:"
  5         ifconfig eth0 | grep "RX pack" | awk '{print $5}'
  6         ifconfig eth0 | grep "TX pack" | awk '{print $5}'
  7         sleep 1
  8 done

15、使用user.txt名单,在计算机中自动创建对应的账户并设置初始密码

  1 #!bin/bash
  2 for i in `cat user.txt`
  3 do
  4         useradd $i
  5         echo "123456" | passwd --stdin $i
  6 done

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
  3 for i in `seq 100`
  4 do
  5         tmp=$[i+tmp]
  6 done
  7 echo "总和是:$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打印色块,并且打印完成色块后不自动换行,在同一行继续输出其他色块
 11 for i in {1..8}
 12 do
 13         for j in {1..8}
 14         do
 15         sum=$[i+j]
 16         if [ $[sum%2] -eq 0 ];then
 17                 echo -ne "33[46m 33[0m"
 18         else
 19                 echo -ne "33[47m 33[0m"
 20         fi
 21         done
 22 echo
 23 done

20、统计每个远程ip访问了本机apache几次?

  1 #!/bin/bash
  2 
  3 awk '{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 $1 in 
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
HISTORY_PATH=/data/nginx/logs/history
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
#按照日期分割访问日志文件
mv "${LOGS_PATH}/access.log" "${HISTORY_PATH}/access_${YESTERDAY}.log"
#安装日期分割错误日志文件
mv "${LOGS_PATH}/error.log" "${HISTORY_PATH}/error_${YESTERDAY}.log"
#重新打开日志文件
kill -USR1 `cat /data/nginx/logs/nginx.pid`


#添加定时任务
# 将脚本文件放在 /data/nginx/sbin 目录下
# 赋予执行权限
#chmod +x /data/nginx/sbin/nginx_log_split.sh
# 设置定时任务,每天0分0点执行一次
# 添加定时任务 
#crontab -e
#0 0 1 * * /data/nginx/sbin/nginx_log_split.sh
# 查看定时任务 
#crontab -l
原文地址:https://www.cnblogs.com/liviniu/p/14818390.html