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:关于一键部署网络的脚本