shell脚本题目
1:批量的创建用户
思路:
1)批量就是循环,输入的是否为数字且不能以0开头的数字
2)判断输入的用户是否为空
这个就是循环的次数是固定
read -p "请输入批量创建多少个用户;" num
if [[ $num =~ ^[0-9]+$ && ! $num =~ ^[0]+ ]];then
read -p "请输入添加用户:" username
if [ ! -z $username ];then
for i in `seq $num`
do
user=$username$i
useradd $user
echo "123456" | passwd --stdin $user &> /dev/null
if [ $? -eq 0 ];then
echo "$user is created"
else
echo "未知错误"
fi
done
else
echo "输入的用户名为空"
fi
else
echo "输入的不是数字或者是以0开头的"
fi
解析:
[[$num =~ ^[0-9]+$ && ! $num =~ ^[0]+ ]] &&匹配 2个全是真就是返回的就是真的 ! 符合匹配的话就返回假的,不符合就返回真的
2:批量的删除用户
思路,1)先遍历/etc/passwd中,把可以登陆的shell的用户提取出来,
2)然后展示,是否删除,删除的话就直接删,不删除的话,展示下一位
#!/bin/bash
#展示用户,是否删除,不删除,则展下一位,删除的话,就删
for i in `grep bash /etc/passwd | cut -d : -f 1`
do
echo "$i用户"
read -p "是否删除:" q
while true
do
if [ -z $q ];then
echo "没有输入"
else
if [ $q == "y" ];then
userdel -r $i
echo "$i 删除成功"
break
else
echo "展示下一位用户"
break
fi
fi
read -p "是否删除:" q
done
done
3:从文件中批量创建用户
使用while语句来完成,因为for语句是以空格来读取文件的,遇见空格就执行,while语句是以行来读取文件,以空格作为分割符
#/bin/bash
#判断是否输入参数
if [ $# -eq 0 ];then
echo "没有输入参数"
exit 10
fi
#判断文件是否为空
if [ ! -f $1 ];then
echo "不是文件"
exit 2
fi
while read line
do
username=`echo $line | awk '{print $1}'`
passwd=`echo $line | awk '{print $2}'`
#判断用户是否存在
id $username &> /dev/null
if [ ! $? -eq 0 ];then
useradd $username
echo "$passwd" | passwd --stdin $username >/dev/null
if [ $? -eq 0 ];then
echo "$username创建成功"
fi
else
echo "用户已经存在了"
fi
done < $1
for 语句也能完成,只不过是要定义分隔符,IFS='
'
#/bin/bash
#首先判断有没有输入参数
if [ $# -eq 0 ];then
echo "没有输入参数"
exit 10
fi
# 判断是否是文件
if [ ! -f $1 ];then
echo "不是文件"
exit 5
fi
IFS='
'
for i in `cat $1`
do
username=`echo "$i"|awk '{print $1}'`
password=`echo "$i"|awk '{print $2}'`
# 判断用户是否存在
id $username &> /dev/null
if [ ! $? -eq 0 ];then
useradd $username
echo "$password" | passwd --stdin $username &> /dev/null
if [ $? -eq 0 ];then
echo "$username is created"
else
echo "未知错误"
fi
else
echo "$username is exist"
fi
done
4:打印一个99乘法表
for i in `seq 9`
do
for j in `seq $i`
do
echo -n -e "$i*$j=$(($i*$j))\t"
done
echo
done
主打的就是一个思路
外面变量控制的是打印几行,里面的变量输出一行打印几个
5:打印一个等腰三角形
read -p "请输入等腰三角形的高" h
for ((i=1;i<=h;i++))
do
#输出2边的空格 就是高-当前行数
a=$(($h-$i))
for j in `seq $a`
do
echo -n " "
done
#输出一行打印几个(奇数)2$i-1
b=$((2*$i-1))
for k in `seq $b`
do
echo -n "*"
done
echo
done
6:判断哪些主机是启动了的(能通信的)
#!/bin/bash
#检测ip地址是否通的问题
#2种情况,第一种就是手动的输入ip地址,第二种就是没有手动的输入,检查一个范围内的ip地址
#判断是否输入了,第一种,用$#来判断 第二种,用-z来判断
if [ $# -eq 0 ];then
#没有输入参数
for i in {1..5}
do
ping -W2 -c2 192.168.20.$i &> /dev/null && echo "192.168.20.$i is success" || echo "192.168.20.$i is error"
done
#输入了参数,测试
else
ping -W2 -c2 192.168.20.$1 &> /dev/null && echo "192.168.20.$1 is success" || echo "192.168.20.$1 is error"
fi
7:删除指定目录里面的文件
就是如果一个目录里面有很多的文件,需要删除,一个一个的删除,比较耗时间,一个脚本,用来判断是否为文件,是的话删除
#!/bin/bash
for i in `ls /tmp`
do
if [ -f /tmp/$i ];then
rm -rf /tmp/$i
else
echo "$i is dir" >> /opt/dir.txt
fi
done
8:备份指定目录文件拷贝到其他目录下,并且指定的备份目录和其他目录从键盘中读取
#!/bin/bash
read -p "yuan dir:" yuan_dir
read -p "dest dir:" dest_dir
for i in `ls $yuan_dir`
do
cp -a $yuan_dir/$i $dest_dir
done
9:判断负载均衡,磁盘的占用率大于80就报警
放在后台,一但超过了就报警,就停止死循环
disk_l=`df -h /|grep /|awk '{print $5}'| tr -d %`
while true
do
if [ $disk_l -gt 80 ];then
echo "disk:$disk_l% is full"
break
else
echo "disk:$disk_l% is free" &> /dev/null
fi
disk_l=`df -h /|grep /|awk '{print $5}'| tr -d %`
done
10:添加用户,指定uid,输入密码
使用位置化参数来添加用户,为root就退出,退出码为10,uid重复就提示重新输入uid,密码输入12345就直接退出,退出码为100,
注意:uid和密码通过键盘输入,用户名通过位置化参数来输入
#!/bin/bash
#先输入用户名,再来输入uid,最后输入密码,然后退出脚本
while true
do
if [ $# -eq 0 ];then
echo "没有输入参数(用户名)"
exit 10
else
#输入root就退出
if [ $1 == "root" ];then
echo "输入root退出"
exit 10
else
read -p "input your uid:" num
while true
do #判断uid是否重复
id $num &> /dev/null
if [ $? -eq 0 ];then
echo "$u 已经存在,请重新输入"
#uid不重复的操作
else
read -p "input your password:" password
#输入12345就直接退出
if [ $password == "12345" ];then
echo "密码输入有误"
exit 100
else
useradd -u $num $1
echo "$password" | passwd --stdin $1 &> /dev/null
break
fi
fi
#当有重复的时候,再次输入uid
read -p "input your uid:" num
done
break
fi
fi
done
11:关于一键部署网络的脚本

浙公网安备 33010602011771号