脚本练习
- 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
脚本执行效果如图:
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
脚本执行效果如图:
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}'`%"
执行效果如下:
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
执行效果如图:
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分区挂载信息
脚本执行效果:
此时脚本执行时自动问答还是有过程的,如若向忽略过程:将问答环节的输出扔到回收站即可
/usr/bin/expect &> /dev/null <<EOF
swapon -a &> /dev/null
如图:
执行脚本效果