shell 学习中脚本的练习
- 编写一个脚本名称为 user_create.sh ,建立 userlist 文件列表中的用户,并设定 userlist 列表的密码为 passlist 文件列表中的密码;当脚本后面跟的文件个数不足两个时,报错;当两个文件行数不一致时报错;当文件不存在时报错;当用户存在时报错。
编写脚本内容如图所示,前面的函数是为了给报错的输出信息添加颜色;后面的 if 语句是为了做判定,先判断当前用户是否为超级用户,如果不是超级用户就没有权限执行新建用户;再判定脚本后的字符串是否小于2,当小于2 时报错;接着判定脚本后的第一个文件是否存在,当不存在时报错;然后判定第二个文件是否存在,当不存在时报错;然后判定两个文件的行数是否相等,当不相等时报错;
当以上的判定都没有问题时,执行下面的脚本内容;将第一个文件中的行数值给一个变量,再执行 for 语句时从第一个开始到变量的行数为止;在 for 语句中,将第一个文件的中的内容依次赋予 USERNAME ,将第二个文件的内容依次赋予 PASSWORD ;然后判定用户是否存在,当用户存在时提示用户已经存在;当用户不存在时,建立该用户,并将 PASSWORD 的值设定为新建用户的密码,并提示用户已经建立;当以上都不成立时,表示系统自身的一些不知道的错误。
执行脚本结果如图所示:
- 数据库脚本
编写脚本名称为 db_dump.sh 的脚本,在执行脚本时后面所跟的字符为数据库的密码;westos(数据库密码)
脚本执行后会备份数据库中的所有库到 /mnt/mysqldump 目录中
备份文件名称为 “库名称.sql"当此文件存在时报错并询问动作输入 “S“ 跳过备份;当输入 “B” 时备份 “库名称.sql” 文件为’库名称_backup.sql“;
当输入 “0”时,覆盖源文件
编写脚本的内容如图所示:
########################
# Create_Time: 2021-03-20
# Author: zxk
#######################
#!/bin/bash
DB_ACTION()
{
read -p "Please input your action:" ACTION
case $ACTION in
B|b|Backup|backup)
mv /mnt/mysql_dump/$DB_ACTION.sql /mnt/mysql_dump/${DB_NAME}_backup.sql
mysqldump -uroot -p$1 $DB_NAME > /mnt/mysql_dump/$DB_NAME.sql
;;
S|s|Skip|skip)
exit
;;
O|o|Overwrite|overwrite)
mysqldump -uroot -p$1 $DB_NAME > /mnt/mysql_dump/$DB_NAME.sql
;;
exit|e|E|Exit)
exit
;;
*)
echo "Please input right action"
DB_ACTION
esac
}
if [ -z "$1" ]
then
echo "Please input DB password following $0 !!"
exit 1
elif [ ! -e "/usr/lib/systemd/system/mariadb.service" ]
then
echo "Error: DB is not installed"
exit 1
elif [ ! -e "/var/lib/mysql/mysql.sock" ]
then
echo "Error: DB is not running"
exit 1
elif [ ! -e "/mnt/mysql_dump" ]
then
mkdir -p /mnt/mysql_dump
else
CHECK_DB=`mysql -uroot -p$1 -NEe "SHOW DATABASES;" 2> /dev/null` && {
DB_LIST=`echo "$CHECK_DB" | awk '!/^*|scheam/{print}'`
}||{
echo "Wrong password!!"
exit 1
}
fi
for DB_NAME in $DB_LIST
do
if [ -e "/mnt/mysql_dump/$DB_NAME.sql" ]
then
echo "/mnt/mysql_dump/$DB_NAME.sql is exist"
echo "[S]kip [O]verwrite [B]ackup [E]xit"
DB_ACTION $1
else
mysqldump -uroot -p$1 $DB_NAME > /mnt/mysql_dump/$DB_NAME.sql
fi
done
执行效果如图所示:
- 编辑一个脚本,用来创建一个 500M 的分区,并将其挂载到 /pub 中,设置开机自动挂载。
编辑脚本内容如图所示,函数为了解决在划定分区时需要回答的问题;由于在划定完分区时保存和新建遇到的问题一样,所以需要用两个 expect 来回答;第二个 expect 中的第一个回答时为了解决在划定分区时可能会出现的问题,这个问题可能存在可能不存在,所以就要将其写入第二个 expect 中;
当以上的判定都没有问题时,执行下面的脚本内容;将第一个文件中的行数值给一个变量,再执行 for 语句时从第一个开始到变量的行数为止;在 for 语句中,将第一个文件的中的内容依次赋予 USERNAME ,将第二个文件的内容依次赋予 PASSWORD ;然后判定用户是否存在,当用户存在时提示用户已经存在;当用户不存在时,建立该用户,并将 PASSWORD 的值设定为新建用户的密码,并提示用户已经建立;当以上都不成立时,表示系统自身的一些不知道的错误。
在脚本运行时,需要先做判定,如果当前用户不是超级用户,那么就要提示用超级用户来做;如果脚本后的内容不存在也要报错;如果脚本后的内容不是一个块设备,也要报错;当以上都没有问题时,执行函数来划定分区,然后将新建立出来的分区格式化成 xfs 格式;格式化之后先在永久挂载文件中过滤新分区的挂载信息是否已经写入配置文件,如果没有便将挂载信息追加到配置文件,追加完成之后,设备便挂载成功,并且设定了永久挂载。
- 编辑一个脚本,检测当前环境中 20-30 号主机是否开启,如果开启将 IP 和主机名对应信息存放在 /var/named/westos.org.zone 中去。
编辑脚本内容如图所示,因为和获得主机开启的主机名,所以就需要连接该主机获得主机名;而前面所写是用一个函数的形式来会回答连接该主机时的一些问题;后面的 for 语句时循环依次连接,先按顺序 ping 一下主机 ip ,当 ping 不通时,说明当前 ip 的主机没有开启;如果 ping 通就 IP 和执行函数获得的主机名导入到 /var/named/westos.org.zone 文件中去。
**注:**此时倒进文件中的信息会有^M ,这是在 unix 中的换行符,要将其去掉应该按 ctrl + v ,然后再按 ctrl +M 来定义要换的内容为 ^M ,否则再做替换时不能被识别。
执行效果如图所示: