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