当前位置: 首页 > article >正文

Linux中shell脚本练习

目录

1.猜数字

2.批量创建用户

3.监控网卡Receive Transmit 数据的变化

4.部署Linux 

5.系统性能检测脚本

6.分区脚本

7.数据库脚本


1.猜数字

随机数的生成

使用环境变量RANDOM,范围是0~32767

编写guest.sh,实现以下功能:
1、随机生成一个1~20的数字;
2、每猜一次都会提示目前数字与随机数的大小关系,直到用户猜对提示成功;
3、当用户输入exit时,退出脚本。

#!/bin/bash
let num=$RANDOM%20
while true
do
        read -p "Please input lucky number:" date
        if [ $date = $num  ]
        then
                echo "yes !!"
                break
        elif [ "$date" = "exit"  ]
        then
                echo "bye!"
                exit
        elif [ $date -gt $num  ]
        then
                echo "too big"
        else
                echo "too small"
        fi
done

2.批量创建用户

执行users_create.sh userlist passlist
建立userlist中的用户
设定userlist中的密码为paslist中的密码
当脚本后面跟得文件个数不足两个时报错
当文件行数不一致时报错
当文件不存在时报错
当用户存在时报错

#!/bin/bash
if [ "$#" -lt "2" ]
then
   echo "error: 文件不足两个"
elif [ ! -e "$1" ]
then
   echo "error: $1 文件不存在"
elif [ ! -e "$2" ]
then
   echo "error: $2 文件不存在"
elif [ "`awk 'END{print NR}' $1 `" != "`awk 'END{print NR}' $2 `" ]
then
   echo "error: 文件行数不一致"

else
   LINES=`awk 'END{print NR}' $1 `
   for LINE in `seq 1 $LINES`
   do
        USERNAME=`sed -n ${LINE}p $1 `
        PASSWORD=`sed -n ${LINE}p $2 `
        if id "$USERNAME" &> /dev/null
        then
                echo "error: $USERNAME 该用户已存在"
        else
        useradd $USERNAME
        echo $PASSWORD | passwd --stdin $USERNAME  &> /dev/null
        echo "$USERNAME  $PASSWORD 用户创建成功"
        fi
   done
fi

3.监控网卡Receive Transmit 数据的变化

#!/bin/bash
if [ -z "$1"  ]
then
        echo Please input net device following $0 !!
elif ifconfig $1 &> /dev/null
then
        while true
        do
                RS1=$(awk "/$1/{print \$2}" /proc/net/dev)
                TR1=$(awk "/$1/{print \$10}" /proc/net/dev)
                sleep 1
                RS2=$(awk "/$1/{print \$2}" /proc/net/dev)
                TR2=$(awk "/$1/{print \$10}" /proc/net/dev)
                echo -ne "Receice: $[$RS2-$RS1]byte/s, Transmit: $[$TR2-$TR1]byte/s"
                echo -ne "\r"
        done
else
        echo no
fi

4.部署Linux 

1.修改IP

2.添加本机解析

3.修改主机名

#!/bin/bash
if  [ -z "1" ]
then
  echo Please input ID following $0 !!
elif echo $1 | grep -E '^[[:digit:]]{1,}$'
then
  echo Please input A number following $0 !!
  hostnamectl set-hostname vm$1
  echo 192.168.67.$1 vm$1 >> /etc/hosts
  DEV_COUNT=`nmcli device show | awk 'BEGIN{N=0}/GENERAL.DEVICE/&&!/lo/{N++}END{ print N}'`
  [ "$DEV_COUNT" -gt "1" ]&&{
  for DEVICE in `nmcli device show | awk '/GENERAL.DEVICE/&&!/lo/{ print $2}'`
  do
        read -p "Do you want set $DEVICE: " STATE
        case $STATE in
           yes|YES|y|Y)
           read -p "Please input ip address: " IP
cat > /etc/sysconfig/network-scripts/ifcfg-$DEVICE <<EOF
BOOTPROTO=none
NAME=$DEVICE
DEVICE=$DEVICE
ONBOOT=yes
IPADDR=$IP
PREFIX=24
DNS1=114.114.114.114
EOF
  ;;
  no|NO|n|N)
  ;;
  *)
  esac
  nmcli connection reload
  nmcli connection up $DEVICE
  done
}
fi

5.系统性能检测脚本

执行check_upload.sh
显示效果如下:
cpu 实际用量%
mem 实际用量%

#!/bin/bash
echo cpu  实际用量 $(printf '%0.2f' `ps ax -o %cpu | awk 'BEGIN{CPU=0}{CPU+=$1}END{print CPU}' `)%
echo mem  实际用量 $(printf '%0.2f' `ps ax -o %mem | awk 'BEGIN{MEM=0}{MEM+=$1}END{print MEM}' `)%

 

6.分区脚本

用脚本在当前系统添加一个swap分区
swap分区大小为500M并开机自动激活分区

#!/bin/bash
if [ -z "$1" ]
then
     echo "error: please input device for swap"
elif [ "$USER" != "root" ]
then
     echo "error: please run $0 with root!!"
else
    [ ! -b "$1" ] && {
       echo "$1 is not block device"
       exit
   }
fi
/usr/bin/expect <<EOF
spawn  fdisk $1
expect {
      "Command" {send "n\r"}
}
expect {
   "Select" { send "\r";exp_continue }
   "Partition number" { send "\r";exp_continue }
   "First sector" { send "\r";exp_continue }
   "Last sector" { send "+500M\r";exp_continue }
   "signature" { send "yes\r";exp_continue }
   "Command" { send "wq\r" }
 }
   expect eof
EOF


fdisk $1 <<EOF
t

82
wq
EOF

DISK=`fdisk -l $1 | awk 'END{print $1}'`
mkswap $DISK

grep ^$DISK /etc/fstab &&{
     swapon -a
}  || {
     echo "$DISK swap swap defaults 0 0 " >> /etc/fstab
     swapon -a
}

 

 

7.数据库脚本

 
执行db_dump.sh westos(数据库密码)
脚本执行后会备份数据库中所有库到 /mnt/mysqldump目录中
备份文件的名称为库名称.sql 当此文件存在时进行如下判断
输入S跳过备份
输入B备份 库名称.sql 到库名称_backup.sql
输入O时,覆盖源文件

#!/bin/bash
if [ -z "$1" ]
then
  echo "Please input password for mysql !"
  exit
fi

rpm -q mariadb-server &> /dev/null || {
  dnf install mariadb-server.x86_64 -y 
}

systemctl status mariadb.service | grep "running" &> /dev/null || {
        systemctl start mariadb.service &> /dev/null
}

DBS=`mysql -uroot -p$1 -EN -e "SHOW DATABASES;" 2> /dev/null | grep -vE "row|_schema$"`
##设定DB并且检测数据库密码是否正确 -N 去表头 2> 过滤错误输出
if [ "$?" -ne "0" ]
then
  echo "Error: Wrong password for db !"
else
  mkdir -p /mnt/mysqldump												##建立多层目录
  for DBNAME in $DBS
  do
    if [ ! -e "/mnt/mysqldump/$DBNAME.sql" ]							##如果不存在
    then
      mysqldump -uroot -p$1  $DBNAME > /mnt/mysqldump/$DBNAME.sql		##备份
    else																##如果存在
      echo "/mnt/mysqldump/$DBNAME.sql is exist !"						##显示已存在
      echo "You can do action: [S]kip [B]ackup [O]verwrite [E]xit"		##提示下一步动作
      while true
      do
        read -p "Please input action: " ACTION
        case $ACTION in
          s|S|skip|Skip)												##直接跳过
          break
          ;;
          b|B|backup|Backup)											##将已存在的备份文件改名并重新备份
          mv /mnt/mysqldump/$DBNAME.sql /mnt/mysqldump/${DBNAME}_backup_`date +%m%d%h`.sql
          mysqldump -uroot -p$1 $DBNAME > /mnt/mysqldump/$DBNAME.sql
          break
          ;;
          o|O|overwrite|Overwrite)										##覆盖已存在的备份文件
          mysqldump -uroot -p$1 $DBNAME > /mnt/mysqldump/$DBNAME.sql
          break
          ;;
          e|E|exit|Exit)												##退出
          break
          ;;
          *)
          echo Wrong action !!											##错误指令
          continue
        esac
      done
    fi
  done
fi

                 


 


http://www.kler.cn/a/108486.html

相关文章:

  • pyparsing如何实现嵌套捕获
  • 云原生服务网格Istio实战
  • 基于python+django的外卖点餐系统
  • 混合开发环境---使用编程AI辅助开发Qt
  • linux系统编程(五)
  • mapStateToProps
  • 【Python 高级特性】深入 NamedTuple 命名元组
  • 第四部分:JavaScript
  • GPT-我的左膀右臂
  • 14 结构性模式-适配器模式
  • 数字信号处理、语音信号处理、现代信号处理
  • 网络原理之TCP/IP
  • 基于引力搜索算法的无人机航迹规划-附代码
  • 吴恩达《机器学习》2-5->2-7:梯度下降算法与理解
  • 基于鸟群算法的无人机航迹规划-附代码
  • etcd问题
  • 前端重新部署如何通知用户更新
  • 【微信小程序开发】学习小程序的网络请求和数据处理
  • vue项目package.json与package-lock.json作用及区别
  • vscode连接服务器一直retry
  • spring boot项目优雅停机
  • 网络协议--TCP的交互数据流
  • 剑指JUC原理-5.synchronized底层原理
  • Less的基本语法
  • 【Mysql】数据库三大范式
  • JAVA 链式编程和建造者模式的使用(lombok的使用)