• Linux中shell脚本练习


    目录

    1.猜数字

    2.批量创建用户

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

    4.部署Linux 

    5.系统性能检测脚本

    6.分区脚本

    7.数据库脚本


    1.猜数字

    随机数的生成

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

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

    1. #!/bin/bash
    2. let num=$RANDOM%20
    3. while true
    4. do
    5. read -p "Please input lucky number:" date
    6. if [ $date = $num ]
    7. then
    8. echo "yes !!"
    9. break
    10. elif [ "$date" = "exit" ]
    11. then
    12. echo "bye!"
    13. exit
    14. elif [ $date -gt $num ]
    15. then
    16. echo "too big"
    17. else
    18. echo "too small"
    19. fi
    20. done

    2.批量创建用户

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

    1. #!/bin/bash
    2. if [ "$#" -lt "2" ]
    3. then
    4. echo "error: 文件不足两个"
    5. elif [ ! -e "$1" ]
    6. then
    7. echo "error: $1 文件不存在"
    8. elif [ ! -e "$2" ]
    9. then
    10. echo "error: $2 文件不存在"
    11. elif [ "`awk 'END{print NR}' $1 `" != "`awk 'END{print NR}' $2 `" ]
    12. then
    13. echo "error: 文件行数不一致"
    14. else
    15. LINES=`awk 'END{print NR}' $1 `
    16. for LINE in `seq 1 $LINES`
    17. do
    18. USERNAME=`sed -n ${LINE}p $1 `
    19. PASSWORD=`sed -n ${LINE}p $2 `
    20. if id "$USERNAME" &> /dev/null
    21. then
    22. echo "error: $USERNAME 该用户已存在"
    23. else
    24. useradd $USERNAME
    25. echo $PASSWORD | passwd --stdin $USERNAME &> /dev/null
    26. echo "$USERNAME $PASSWORD 用户创建成功"
    27. fi
    28. done
    29. fi

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

    1. #!/bin/bash
    2. if [ -z "$1" ]
    3. then
    4. echo Please input net device following $0 !!
    5. elif ifconfig $1 &> /dev/null
    6. then
    7. while true
    8. do
    9. RS1=$(awk "/$1/{print \$2}" /proc/net/dev)
    10. TR1=$(awk "/$1/{print \$10}" /proc/net/dev)
    11. sleep 1
    12. RS2=$(awk "/$1/{print \$2}" /proc/net/dev)
    13. TR2=$(awk "/$1/{print \$10}" /proc/net/dev)
    14. echo -ne "Receice: $[$RS2-$RS1]byte/s, Transmit: $[$TR2-$TR1]byte/s"
    15. echo -ne "\r"
    16. done
    17. else
    18. echo no
    19. fi

    4.部署Linux 

    1.修改IP

    2.添加本机解析

    3.修改主机名

    1. #!/bin/bash
    2. if [ -z "1" ]
    3. then
    4. echo Please input ID following $0 !!
    5. elif echo $1 | grep -E '^[[:digit:]]{1,}$'
    6. then
    7. echo Please input A number following $0 !!
    8. hostnamectl set-hostname vm$1
    9. echo 192.168.67.$1 vm$1 >> /etc/hosts
    10. DEV_COUNT=`nmcli device show | awk 'BEGIN{N=0}/GENERAL.DEVICE/&&!/lo/{N++}END{ print N}'`
    11. [ "$DEV_COUNT" -gt "1" ]&&{
    12. for DEVICE in `nmcli device show | awk '/GENERAL.DEVICE/&&!/lo/{ print $2}'`
    13. do
    14. read -p "Do you want set $DEVICE: " STATE
    15. case $STATE in
    16. yes|YES|y|Y)
    17. read -p "Please input ip address: " IP
    18. cat > /etc/sysconfig/network-scripts/ifcfg-$DEVICE <<EOF
    19. BOOTPROTO=none
    20. NAME=$DEVICE
    21. DEVICE=$DEVICE
    22. ONBOOT=yes
    23. IPADDR=$IP
    24. PREFIX=24
    25. DNS1=114.114.114.114
    26. EOF
    27. ;;
    28. no|NO|n|N)
    29. ;;
    30. *)
    31. esac
    32. nmcli connection reload
    33. nmcli connection up $DEVICE
    34. done
    35. }
    36. fi

    5.系统性能检测脚本

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

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

     

    6.分区脚本

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

    1. #!/bin/bash
    2. if [ -z "$1" ]
    3. then
    4. echo "error: please input device for swap"
    5. elif [ "$USER" != "root" ]
    6. then
    7. echo "error: please run $0 with root!!"
    8. else
    9. [ ! -b "$1" ] && {
    10. echo "$1 is not block device"
    11. exit
    12. }
    13. fi
    14. /usr/bin/expect <<EOF
    15. spawn fdisk $1
    16. expect {
    17. "Command" {send "n\r"}
    18. }
    19. expect {
    20. "Select" { send "\r";exp_continue }
    21. "Partition number" { send "\r";exp_continue }
    22. "First sector" { send "\r";exp_continue }
    23. "Last sector" { send "+500M\r";exp_continue }
    24. "signature" { send "yes\r";exp_continue }
    25. "Command" { send "wq\r" }
    26. }
    27. expect eof
    28. EOF
    29. fdisk $1 <<EOF
    30. t
    31. 82
    32. wq
    33. EOF
    34. DISK=`fdisk -l $1 | awk 'END{print $1}'`
    35. mkswap $DISK
    36. grep ^$DISK /etc/fstab &&{
    37. swapon -a
    38. } || {
    39. echo "$DISK swap swap defaults 0 0 " >> /etc/fstab
    40. swapon -a
    41. }

     

     

    7.数据库脚本

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

    1. #!/bin/bash
    2. if [ -z "$1" ]
    3. then
    4. echo "Please input password for mysql !"
    5. exit
    6. fi
    7. rpm -q mariadb-server &> /dev/null || {
    8. dnf install mariadb-server.x86_64 -y
    9. }
    10. systemctl status mariadb.service | grep "running" &> /dev/null || {
    11. systemctl start mariadb.service &> /dev/null
    12. }
    13. DBS=`mysql -uroot -p$1 -EN -e "SHOW DATABASES;" 2> /dev/null | grep -vE "row|_schema$"`
    14. ##设定DB并且检测数据库密码是否正确 -N 去表头 2> 过滤错误输出
    15. if [ "$?" -ne "0" ]
    16. then
    17. echo "Error: Wrong password for db !"
    18. else
    19. mkdir -p /mnt/mysqldump ##建立多层目录
    20. for DBNAME in $DBS
    21. do
    22. if [ ! -e "/mnt/mysqldump/$DBNAME.sql" ] ##如果不存在
    23. then
    24. mysqldump -uroot -p$1 $DBNAME > /mnt/mysqldump/$DBNAME.sql ##备份
    25. else ##如果存在
    26. echo "/mnt/mysqldump/$DBNAME.sql is exist !" ##显示已存在
    27. echo "You can do action: [S]kip [B]ackup [O]verwrite [E]xit" ##提示下一步动作
    28. while true
    29. do
    30. read -p "Please input action: " ACTION
    31. case $ACTION in
    32. s|S|skip|Skip) ##直接跳过
    33. break
    34. ;;
    35. b|B|backup|Backup) ##将已存在的备份文件改名并重新备份
    36. mv /mnt/mysqldump/$DBNAME.sql /mnt/mysqldump/${DBNAME}_backup_`date +%m%d%h`.sql
    37. mysqldump -uroot -p$1 $DBNAME > /mnt/mysqldump/$DBNAME.sql
    38. break
    39. ;;
    40. o|O|overwrite|Overwrite) ##覆盖已存在的备份文件
    41. mysqldump -uroot -p$1 $DBNAME > /mnt/mysqldump/$DBNAME.sql
    42. break
    43. ;;
    44. e|E|exit|Exit) ##退出
    45. break
    46. ;;
    47. *)
    48. echo Wrong action !! ##错误指令
    49. continue
    50. esac
    51. done
    52. fi
    53. done
    54. fi


     

  • 相关阅读:
    Python读取Excel文件中指定的列数并生成CSV文件
    node的服务端对接科大讯飞-火星ai解决方案
    AntSK 0.2.1 版本揭秘:动态加载dll,驱动Function Call新境界!
    h264和h265视频流SDP描述详解
    C语言表达式求值、隐式类型转换、算数转换
    分享关于职场心态
    机器学习垃圾邮件分类
    快鲸智慧楼宇数字化管理平台,赋能商业地产快速转型升级
    C++ std::find()实例讲解
    Yolov8模型训练报错:torch.cuda.OutOfMemoryError
  • 原文地址:https://blog.csdn.net/weixin_56744753/article/details/134097122