shell脚本练习题

1.备份网卡配置文件
要求:
1)备份的目录在/data/backconf
2)备份的文件名称格式为:网卡文件名.bak.年月日时分秒
例如:ifcfg-ens33.bak.20220913183028
3)将备份的记录输出到备份目录下的日志文件中,日志文件名为
网卡文件名.log.年月日时分秒,例如ifcfg-ens33.log.20220913183028
日志内容要求有备份的时间,备份的文件路径

#!/bin/env bash
path=/etc/sysconfig/network-scripts
read -p "请输入网卡配置文件名称:" name
mkdir -p /data/backconf
centime=`date '+%Y%m%d%H%M%S'`
cp -f ${path}/${name} /data/backconf/"${name}.bak.${centime}"
echo "${path}/${name}已备份完成,存放路径:/data/backconf/${name}.bak.${centime}" >> /data/backconf/${name}.log.${centime}

2.收集记录文件记录
要求:
1.)创建日志目录在/data/log
2.)将/var/log/目录下的文件,大小在1M以上的,将文件的信息输出到/data/log下,文件名称loginfo_年月日时分秒.log,例如loginfo_20220913183028.log

#!/bin/env bash
mkdir -p /data/log
path=/data/log
centime=`date '+%Y%m%d%H%M%S'`
find /var/log -type f -a -size +1M >> ${path}/loginfo.${centime}.log

3.脚本自动创建目录
要求:
1.)在/tmp目录下生成12个月的目录,这12目录下有31个子目录

#!/bin/env/bash
for i in {1..12}
do
        for ((j=1;j<=31;j++))
        {
           mkdir -pv /tmp/month$i/day$j
        }
done

4.记录网卡信息到系统
要求:
通过脚本将本机的IP地址信息,记录到系统中,用户一登录到即可以通过查询变量的方式直接获取到该信息。

#!/bin/env bash
echo "ip=`ifconfig |grep broadcast|awk '{print $2}'`" >>/etc/profile.d/test.sh

5.批量安装软件
要求:
1)通过脚本安装多个软件
2)不显示安装过程

#!/bin/env/bash
for i in $*
do
yum -y install $i >/dev/null 2>&1
! [ -x "$(command -v $i)" ] && echo "Error: $i installation failed." || echo "$i  installation succeed "
done

6.变量替换应用脚本
产生测试文件
touch /tmp/test{001…100}.tar.gz
要求:
当FILEPATH为空值时删除/tmp下的.tar.gz文件,

#!/bin/bash
FILEPATH=''
echo "现在开始删除压缩文件"
rm -rf ${FILEPATH:-/tmp}/*.tar.gz && echo "删除完成"

7.变量长度截取练习脚本
要求:
现有某用户的ID为110600198808085513,使用脚本完成如下操作
1.创建用户,用户名为test+年月日时分秒,例如:test.20220913183028
2.为用户指派密码,密码为ID的第7至14位。
3.记录用户生成时间与密码至日志文件中,日志文件位置/tmp/adduser.log
4.创建工作目录,工作目录为/data/home/用户名
5.授权只有该用户对此工作h目录完全访问,其他人无权限访问。

#!/bin/bash
CURTIME=`date +%Y%m%d%H%M%S`
ID='430600198808085513'
USERNAME='test'
PASSWD=${ID:6:8}
echo "passwd:${PASSWD}"
useradd test.${CURTIME} >/dev/null 2>&1
echo "${PASSWD}\n${PASSWD}" | passwd ${USERNAME}.${CURTIME} --stdin
echo "${USERNAME}.${CURTIME}" >/tmp/adduser.log
echo "${PASSWD}" >>/tmp/adduser.log
if [ -d /data/home/$USERNAME.${CURTIME} ];
#条件式成立,目录存在
then
        chmod 700 /data/home/$USERNAME.${CURTIME}
        chown $USERNAME.${CURTIME} /data/home/$USERNAME.${CURTIME}
else
        mkdir -p /data/home/$USERNAME.${CURTIME}
        chmod 700 /data/home/$USERNAME.${CURTIME}
        chown $USERNAME.${CURTIME} /data/home/$USERNAME.${CURTIME}
fi 

8.删除用户脚本
要求:
删除题目2中生成的用户,保留工作目录

#!/bin/bash
userdel `cat /tmp/adduser.log  | head -1`
id `cat /tmp/adduser.log | head -1` 2>/dev/null || echo "userdel ok"

9.收集记录文件名记录
要求:
1.)将/var/log/目录下的文件,大小在1M以上的,将第1个文件的文件名输出到/tmp下,文件名称loginfo_年月日时分秒.log
例如:loginfo_20220913183028.log

#!/bin/bash
CURTIME=`date +%Y%m%d%H%M%S`
GETFILE=`find /var/log/ -type f -size +1M  | head -1`
FILENAME=`basename ${GETFILE}`
echo ${FILENAME}>/tmp/loginfo_${CURTIME}.log

10.批量创建用户练习
要求:
1.批量创建用户,用户名为qf2203+编号,例如qf220301
2.为用户指派密码,密码为用户名。
3.记录用户至日志文件中,日志文件位置/tmp/adduser.log
4.创建工作目录,工作目录为/data/home/用户名
5.授权只有该用户对此工作目录完全访问,其他人无权限访问。

#!/bin/env bash
for i in {1..10}
do
	useradd  qf2203$i
	echo "qf2203$i" |passwd --stdin qf2203$i
	echo "username:qf2203$i passwd:qf2203$i" >>/tmp/adduser.log
	[ ! -d /data/home/qf2203$i ] && mkdir -p /data/home/qf2203$i
	chown qf2203$i /data/home/qf2203$i
	chmod 700 /data/home/qf2203$i
done

11.批量删除用户脚本
要求:
删除练习1中生成的用户,删除创建工作目录

#!/bin/env bash
users=`cat /tmp/adduser.log|awk -F":" '{print $2}'|awk '{print $1}'`
echo $users
for i in $users
do
	userdel -r $i
done

12.备份文件脚本
要求:
1.判断备份目录/data/backup是否存在,不存在则创建
2.判断备份目录下是否有网卡的配置文件,不存在则备份,备份的文件名称:ifcfg-ens33.bak

#!/bin/env bash
[ ! -d /data/backup ] && mkdir -p /data/backup ||echo "/data/backup已存在"
ENS33="/etc/sysconfig/network-scripts/ifcfg-ens33"
if test -f /data/backup/ifcfg-ens33.back ;then
        echo "网卡配置文件已存在"
else
        cp ${ENS33} /data/backup/ifcfg-ens33.back >/dev/null 2>&1
        echo "网卡配置文件完成备份"
fi

13.case语句
要求:
1.使用case语句对用户输入的内容进行判断,是否为数值

#!/bin/bash
read -p "请输入:" get
expr $get + 0 &>/dev/null
case $? in
        0)
                echo -e "你输入的是数字\n"
        ;;
        *)
                echo -e "你输入的不是数字\n"
        ;;
esac

14.使用for循环脚本自动创建目录
要求:
1.)在/tmp目录下生成33个目录,名称为qf220301,qf220302,qf220330个的目录,这33个目录下各有4个子目录
名称分别为project01,project02,…project04

#!/bin/bash
for i in {01..33}
do
        mkdir /tmp/qf2203$i
        for j in {01..04}
        do
                mkdir /tmp/qf2203$i/$j
        done
done
echo "创建完成"

15.使用case完成如下功能。
按下a键可以实现收集记录文件记录
具体要求:

1.判断创建日志目录/data/filelog,是否存在,以及创建工作/data/filelog
2.将/var/log/目录下的文件,大小在1M以上的,复制到日志目录/data/filelog下。
3.将步骤2中的文件完整的路径信息输出到/data/filelog目录下,产生日志文件,文件名称
loginfo_年月日时分秒.log,例如loginfo_20220913183028.log
按下b键可以实现清理日志文件
具体要求:
清理/data/filelog目录下的文件
按下q键退出

#!/bin/bash
cat <<-EOF
+------------------------------------------------------------+
|                         logs_tools v1.0                    |
|                         a.收集文件记录                       |
|                         b.清理日志文件                       |
|                         q.退出                              |
+------------------------------------------------------------+

EOF
while (1>0)
do
        read -p "请输入选项:" var
        case "$var" in
                "a")
                        [ ! -d /data/filelog ] && mkdir -p /data/filelog ||echo "/data/filelog已存在"
                        files=`find /var/log/ -size +1M -a -type f`
                        cp -f $files /data/filelog && echo "copy完成" 
                        centime=`date +%Y%m%d%H%M%S`
                        echo $files |tee /data/filelog/loginfo_${centime}.log >/dev/null 2>&1
                ;;
                "b")
                        echo "开始清理日志文件" && rm -rf /data/filelog/*.log && echo "清理完成"
                ;;
                "q")
                        break
                ;;
                *)
                        echo "请按提示内容输入!"
                ;;
        esac
done    

16.利用shift创建多个用户

#!/bin/bash
if [ $# -eq 0 ];then
        echo "请输入用户名!"
else
        while [ ! $# -eq 0 ] 
        do
                id $1 &>/dev/null
                if [ $? -eq 0 ];then
                        echo "$1已存在"
                        shift
                else
                        useradd $1
                        echo "$1" |passwd --stdin $1 && echo "$1创建成功"
                        shift
                fi
        done
fi

17.利用函数批量创建用户

#!/bin/bash
adduser(){
USERNAME=$1
for (( i=1;i<=$2;i++ ))
do
id ${USERNAME}$i &>/dev/null
if [ $? -eq 0 ] ; then
        echo "  ${USERNAME}$i已存在"
else
        useradd ${USERNAME}$i
        echo "${USERNAME}$i" | passwd ${USERNAME}$i --stdin
        echo "${USERNAME}$i" >>/tmp/adduser.log
        [ -d /data/home/${USERNAME}$i ] || mkdir -p /data/home/${USERNAME}$i
        chown ${USERNAME}$i /data/home/${USERNAME}$i
        chmod 750 /data/home/${USERNAME}$i
fi
done
}
read -p "请输入用户名前缀(不输入默认为qf):" name
read -p "请输入用户数量 (不输入默认为15):" num

adduser ${name:=qf} ${num:=15}

18.利用数组获取系统中的用户名

#!/bin/bash
while read line   #数组赋值
do
        host[i++]=`echo $line | awk -F ":" '{print $1}'`
done </etc/passwd
for i in ${!host[@]}   #数组遍历,建议使用索引遍历
do
        echo "$i:${host[i]}"
done 

19.利用关联数组统计系统中不同登录Shell的数量

declare -A shells
while read line
do
        type=`echo $line | awk -F":" '{print $NF}'`
        let shells[$type]++   #匹配到之后加1
done < /etc/passwd
for i in ${!shells[@]}
do
        echo "$i: ${shells[$i]}"  #数组名加上索引统计出值
done

20.生产测试文件,将/tmp/city.txt的内容赋值到数组C_NAME中,读取数值内的赋值,使用for循环完成批量创建目录操作,目录位于/tmp/下。最终city.txt有多少个名字,则在/tmp下产生多少个目录

#!/bin/bash
#产生测试文件
[ -f /tmp/city.txt ] || cat >/tmp/city.txt<<EOF
shenzhen
shanghai
beijing
changsha
wuhan
zhenzhou
EOF
#方法一
C_NAME=( `cat /tmp/city.txt` )
#方法二
#while read line
#do
#C_NAME[i++]=$line
#done < /tmp/city.txt
for n in ${!C_NAME[@]}
do
mkdir -p /tmp/${C_NAME[n]}
done 

你可能感兴趣的:(笔记,linux)