脚本练习

  • 1.倒计时脚本
  • 2.数字竞猜脚本
  • 3.用户建立脚本
  • 4.系统资源占用统计脚本
  • 5.数据库脚本
  • 6.创建swap分区脚本


写脚本时在掌握好所需要的基础指令后,最关键的是脚本思路,逻辑不清晰的话写的脚本就会很复杂
注意:写脚本时写好一部分就调试脚本效果!

1.倒计时脚本

脚本要求:
可以倒计时XX分XX秒

脚本思路:
根据脚本要求我们需要写一个包括分钟和秒的倒计时脚本
(1)首先我们用到交互式脚本语言read -p 让用户字形输入所需要倒计时的时间
(2)其次需要设置变量
(3)利用for语言设计简单的算法,让分钟和秒的总和递减1,当减为0时停止即可
(4)显示分:秒 ,分=时间总和/60,秒=时间总和%60
(5)sleep 1 使脚本每执行一次沉睡1秒
完成!!!

#!/bin/bash
read -p "Please input a number——minute:" MINUTE
read -p "Please input a number again——second:" SECOND
((MAX="$MINUTE*60"+"$SECOND"))
for ((i="$MAX";i>=0;i--))
do
    if [ "$i" = "0" ]
    then 
        echo "Time is over !"
        exit
    fi  
    ((Min=$i/60))
    ((Sec=$i%60))
    echo "$Min : $Sec"
    sleep 1
    clear
done

linux 中的lua脚本 linux脚本例子_linux 中的lua脚本


脚本执行效果如图:

linux 中的lua脚本 linux脚本例子_linux 中的lua脚本_02

linux 中的lua脚本 linux脚本例子_数据库_03

2.数字竞猜脚本

脚本要求:
编写一个数字竞猜脚本,随机生成一个10以内的数字,提示用户输入数字,没有输入时汇报错,输入数字小于幸运数字时会显示small,输入数字大于幸运数字时会显示large
猜中幸运数字时会显示$1 is lucky number 并退出

脚本思路:
(1)$RANDOM 是系统随机出现的4-5位数,我们利用它来设置我们随机的幸运数字
(2)利用while循环语句让用户循环输出数字来猜幸运数字,if语句来判断输入的数字是否符合答案,直到符合后退出

#!/bin/bash
LUCK=$[ $RANDOM%10 ]
while true
do 
read -p "Please input lucky number:" NUM 
 if [ -z "$NUM" ]
 then 
   echo "Please input a number !"
 elif [ "$NUM" -eq "$LUCK" ]
 then  
   echo "$NUM is lucky number !!"
   exit
 elif [ "$NUM" -ge "$LUCK" ]
 then  
   echo large !
 else
   echo small !
 fi
done

linux 中的lua脚本 linux脚本例子_shell脚本_04


脚本执行效果如图:

linux 中的lua脚本 linux脚本例子_mysql_05

3.用户建立脚本

脚本要求:
执行脚本时,后面需要跟一个用户列表文件和一个用户密码列表文件
建立用户列表userlist中的用户,并设定相对应密码列表passlist中的密码 当脚本后不足两个文件时报错
当两个文件行数不一致时报错
当文件不存在时报错 当用户存在时报错

脚本思路:
(1)根据脚本要求,检测实行脚本时输入不能为空,而且必须是两个文件;
(2)通过变量赋值比较梁文件行数是否一致,一致则创建对应用户,不对应则显示文件不对应

#!/bin/bash
[ -z "$1" ]  && {
  echo "Errow:Please input two files !"
  exit
  }
[ -z "$2" ]  && {
  echo "Errow:Please input two files !"
  exit
  }
[ ! -e  "$1" ] && {
  echo "$1 is not file"
  exit
  }
[ ! -e  "$2" ] && {
  echo "$2 is not file"
  exit
  }
a=$( cat $1 | wc -l)
b=$( cat $1 | wc -l)

[ $a -ne $b ] && {
echo "$1's line is different then $2"
}||{
  for user in `cat $1`
  do
  id $user &> /dev/null && {
  echo "Errow: $user is exist "
  userdel -r $user &> /dev/null
  }||{
  pass=`sed -n ${N}p $2`
  useradd $user  &> /dev/null
  echo $pass | passwd --stdin $user &> /dev/null
  echo $user is created
  }
  done
  }

4.系统资源占用统计脚本

脚本要求:

执行脚本显示如下
cpu: 实际用量%

mem: 实际用量%

脚本思路:
(1)用ps和awk筛选出脚本要求内容
(2)按照要求格式显示

#!/bin/bash
echo "MemUsed:  `ps ax -o %mem|awk 'BEGIN{M=0}!/MEM|0.0/{M+=$1}END{print M}'`%"
echo "CPUUsed:  `ps ax -o %cpu|awk 'BEGIN{C=0}!/MEM|0.0/{C+=$1}END{print C}'`%"

linux 中的lua脚本 linux脚本例子_linux_06


执行效果如下:

linux 中的lua脚本 linux脚本例子_数据库_07

5.数据库脚本

脚本要求:
执行db_dump.sh 后可以备份数据库中的所有库到/mnt/mysqldump目录中
备份文件名称为“库名称.sql”当此文件存在时报错并询问动作
输入S跳过备份
输入B时备份“库名称.sql”文件为“库名称_backup.sql”
当输入0时,覆盖原文件
输入E时,退出脚本

脚本思路:
(1)考虑进入数据库时所需要输入的密码是否为空是否正确;用户主机是否下载了数据库服务;服务是否已经启动
(2)因为要求需要备份文件到指定目录中,创建相应目录;利用case语句执行相应的动作
(3)由于执行动作指令很多且是交互式,所以应该为循环脚本,case语句需要包含在while语句内循环执行,直到输入退出指令
注意: grep -v 是指定不输出什么

#!/bin/bash
[ -z "$1" ] && {
  echo "Errow: Please input DB password following $0 !!"
  exit 1
  }
rpm -q mariadb-server &> /dev/null
[ "$?" != "0" ] && {
  echo "Error: DB server is not installed !!"
  exit
  }
[ ! -e "/var/lib/mysql/mysql.sock" ] && {
  echo "Error: DB server is not running !!"
  exit 1
  }
DB_LIST=`mysql -uroot -p$1 -e "SHOW DATABASES;" 2> /dev/null | grep -E -v "Database|_schema$"`
if [ "$?" != "0" ]
then
  echo "Error: Wrong password !!"
else
  mkdir -p /mnt/mysqldump
  for DB in $DB_LIST
  do
        echo "Please input 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/$DB.sql /mnt/mysqldump/${DB}_backup_`date +%Y-%m-%d%s`.sql
          mysqldump -uroot -p$1 $DB > /mnt/mysqldump/$DB.sql
          break
          ;;
          o|O|overwrite|Overwrite)
          mysqldump -uroot -p$1 $DB > /mnt/mysqldump/$DB.sql
          break
          ;;
          e|E|exit|Exit)
          exit
          ;;
          *)
          echo "Error: Wrong action!!"
        esac
      done
   done
fi

执行效果如图:

linux 中的lua脚本 linux脚本例子_shell脚本_08

6.创建swap分区脚本

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

脚本思路:
(1)当我们使用fdisk交互方式分区时需要回答很多问题,要编写此脚本自动创建swap分区并且自动挂载就需要使用expect语句。
(2)建立swap分区需要先建立一个500M分区,然后将其格式改为swap;所以我们需要编写两个expect语句块
(3)脚本全程需要自动回答问题,所以我们先判定执行脚本时创建分区的块设备存在
(4)编写第一个expect语句块,帮助我们回答创建大小500M分区时的问题
(5)第二个expect语句块,更改指定变量分区的分区类型为linux swap(82),这里我们可以使用awk提取相关变量值使用,更改后wq保存
(6)对swap分区格式化,将策略挂载语句写入/etc/fstab设备挂载策略文件,开机时将自动激活次分区
**注意:**expect语句回答完问题最后也需要wq退出保存

#!/bin/bash
[ -z "$1" ] && {
  echo "Please input device following $0 !"
  exit
  }
[ ! -e "$1" ] && {
  echo "Error: $1 is not exist !"
  exit
  }
 
/usr/bin/expect <<EOF
spawn fdisk $1
expect {
"Command" { send "n\r";exp_continue }
"default p" { send "p\r";exp_continue }
"Partition number" { send "\r";exp_continue }
"First sector" { send "\r";exp_continue }
"Last sector" { send "+500M\r" }
}
expect {
"signature?" { send "yes\r";exp_continue }
"Command" { send "wq\r" }
}
expect eof
EOF
DEVICE=`fdisk -l /dev/vdb | tail -n 1 | awk '{print $1}'`
DEVICE_NUM=`fdisk -l /dev/vdb | tail -n 1 | awk '{print $1}' | awk -F "/dev/vdb" '{print $2}'`
DEVICE_TYPE=`fdisk -l /dev/vdb | tail -n 1 | awk '{print $6}'`
if [ "DEVICE_TYPE" != "82" ]
then
/usr/bin/expect <<EOF
spawn fdisk $1
expect {
"Command" { send "t\r";exp_continue } 
"Partition number" { send "$DEVICE_NUM\r";exp_continue }
"Hex code" { send "82\r" }
}
expect "Comman"
send "wq\r"
expect eof
EOF
fi
mkswap $DEVICE
grep $DEVICE /etc/fstab &> /dev/null
if [ "$?" -ne "0" ]
then
  echo "$DEVICE swap swap defaults 0 0" >> /etc/fstab
fi
swapon -a

执行脚本后 swapon -s 可以查看新建swap分区挂载信息

脚本执行效果:

linux 中的lua脚本 linux脚本例子_linux_09


linux 中的lua脚本 linux脚本例子_linux 中的lua脚本_10

linux 中的lua脚本 linux脚本例子_shell脚本_11

此时脚本执行时自动问答还是有过程的,如若向忽略过程:将问答环节的输出扔到回收站即可

/usr/bin/expect &> /dev/null <<EOF
swapon -a &> /dev/null

如图:

linux 中的lua脚本 linux脚本例子_linux 中的lua脚本_12

执行脚本效果

linux 中的lua脚本 linux脚本例子_mysql_13