zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Mysql常用命令行大全(转)
    python 列表返回重复数据的下标
    啊哈算法, 水管工游戏
    python 实现结构体
    最长子回文字符串(Manacher’s Algorithm)
    一张图说明容器和镜像和仓库的关系
    nginx命令大全
    Django(request和response)
    python django + js 使用ajax进行文件上传并获取上传进度案例
    详解django三种文件下载方式
  • 原文地址:https://www.cnblogs.com/liviniu/p/14818390.html
Copyright © 2011-2022 走看看