关于for嵌套循环的几个shell脚本

1.计算n以内能被3整除的数的和(包括n)

#!/bin/bash
# **********************************************************
# * Author        : oldwang
# * Email         : lilulilu6666@163.com
# * Create time   : 2020-12-07 18:03
# * Filename      : 8.sh
# * Description   : lueluelue
# **********************************************************
read -p "请问你要计算几以内能被3整除的数的和: " Num
if [ -z $Num ];then
echo "输入内容不能为空!"
exit
fi

expr $Num + 1 &> /dev/null
if [ $? -ne 0 ];then
echo "输入内容必须为数字!"
exit
fi

a=0
for i in $(seq 1 $[ $Num ])
do
        result=$[ $i % 3 ]
        if [ $result -eq 0 ];then
                a=$[ $a+$i ]
        fi
done
echo "$Num以内能被3整除的数的和为:$a"

2.找出文件2中有,但文件1中没有的IP地址

#!/bin/bash
# **********************************************************
# * Author        : oldwang
# * Email         : lilulilu6666@163.com
# * Create time   : 2020-12-07 20:45
# * Filename      : 12.2.sh
# * Description   : lueluelue
# **********************************************************
echo "此脚本用于找出文件2中有,但文件1中没有的IP地址"
read -p "请输入文件1的路径: " File1
if [ -z $File1 ];then
echo "输入内容不能为空!"
exit
fi

read -p "请输入文件2的路径: " File2
if [ -z $File2 ];then
echo "输入内容不能为空!"
exit
fi
echo "文件2中有,但文件1中没有的IP地址有:"
a=0
#文件1的行数
Line=$(cat ${File1} | wc -l)
for i in $(cat ${File2})
do
        for j in $(cat ${File1})
        do
                #将文件2中的ip依次与文件1中的对比
                echo "${i}" | grep -w "${j}" &> /dev/null
                #不一致则a增加1
                if [ $? -ne 0 ];then
                        a=$[ $a+1 ]
                else
                #当发现文件2中的ip文件1中也有时,重置a=0,并跳出此循环
                        a=0
                        break
                fi
        done
        #当a的值与文件1的行数相等时,也就是文件2中的此ip已经与文件1中所有ip全都对比过,并没有发现重复.就将此
ip输出,并重置a=0.
        if [ $a -eq $Line ];then
        echo "$i"
        a=0
        fi
done

3.根据文件中的用户名密码批量创建用户(文件内容格式 用户名:密码)

#!/bin/bash
# **********************************************************
# * Author        : oldwang
# * Email         : lilulilu6666@163.com
# * Create time   : 2020-12-07 20:05
# * Filename      : 6.sh
# * Description   : lueluelue
# **********************************************************
for i in $(cat user_passwd.txt)
do
        username=$(echo "${i}" | awk -F ':' '{print $1}')
        password=$(echo "${i}" | awk -F ':' '{print $2}')
        id ${username} &> /dev/null
        if [ $? -ne 0 ];then
                useradd ${username} && \
                echo "${password}" | passwd --stdin ${username} &> /dev/null
                echo "用户${username}已创建成功!密码为: ${password}"
        else
                echo "用户${username} 已经存在!"
        fi
done
echo "文件 /tmp/sh/2020-12-07_练习题/user_passwd.txt 中的用户已经创建完毕!"

4.自定义用户名前缀,用户数量和密码,批量创建用户

#!/bin/bash
# **********************************************************
# * Author        : oldwang
# * Email         : lilulilu6666@163.com
# * Create time   : 2020-12-07 19:20
# * Filename      : 5.sh
# * Description   : lueluelue
# **********************************************************
read -p "请输入要创建的用户名前缀: " User_name
if [ -z $User_name ];then
echo "输入内容不能为空!"
exit
fi
if [[ $User_name =~ [0-9]+ ]];then
echo "用户名中不能包含数字!"
exit
fi
read -p "请输入要创建的用户数量: " Count
if [ -z $Count ];then
echo "输入内容不能为空!"
exit
fi
if [[ $Count =~ [a-Z]+ ]];then
echo "只能输入数字!"
exit
fi
read -p "请输入用户的统一密码: " Passwd
if [ -z $Passwd ];then
echo "输入内容不能为空!"
exit
fi
read -p "确认批量创建创建用户名前缀为 $User_name , 数量为: $Count , 统一密码为: $Passwd 的用户吗 [ y | n ] : " Action
case $Action in
        y)
                for i in $(seq -w ${Count})
                do
                id ${User_name}${i} &>/dev/null
                if [ $? -eq 1 ];then
                        useradd ${User_name}${i} &> /dev/null
                        echo "$Passwd" | passwd --stdin ${User_name}${Count} &> /dev/null
                        echo "用户${User_name}${i}创建成功!密码为: $Passwd"
                else
                echo "用户${User_name}${i} 已存在!"
                fi
                done
                ;;
        n)
                echo "再见!"
                exit
                ;;
        *)
                echo "只能输入 y 或 n !"
esac

5.分库分表备份

#!/usr/bin/bash
. /etc/init.d/functions
mysql_user=root
mysql_pass=123
mysql_data_list=$(mysql -u${mysql_user} -e "show databases;"|sed 1d | egrep -v "*_schema|mysql")
mysql_path=/backup/mysql
mysql_date=$(date +%F)


# 准备备份的目录
if [ ! -d ${mysql_path} ];then
	mkdir -p ${mysql_path}
fi

#外循环: 拿到库名称,每一次都会拿到不一样的库名
for dataname in ${mysql_data_list}
do
	# 内循环要做的事情: 将获取到的库名,在获取到其表名,赋值给mysql_table_list变量
	mysql_table_list=$(mysql -u${mysql_user} -e "use ${dataname};show tables;" | sed 1d)

	# 准备表存储的位置/backup/mysql/wordpress/2020-12-08
	if [ ! -d ${mysql_path}/${dataname}/${mysql_date} ];then
		mkdir -p ${mysql_path}/${dataname}/${mysql_date}
	fi
	
	# 内循环: 将每一个表名称都赋值给tablename变量
	for tablename in ${mysql_table_list}
	do
		# 执行备份操作
		mysqldump -u${mysql_user} ${dataname} ${tablename} > ${mysql_path}/${dataname}/${mysql_date}/${tablename}.sql
		if [ -s ${mysql_path}/${dataname}/${mysql_date}/${tablename}.sql ];then
			action "库名称:${dataname} --> 表名称: ${tablename} 备份" /bin/true
		else
			action "库名称:${dataname} --> 表名称: ${tablename} 备份" /bin/false
		fi
	done
done

6.九九乘法表

#!/bin/bash
# **********************************************************
# * Author        : oldwang
# * Email         : lilulilu6666@163.com
# * Create time   : 2020-12-08 11:08
# * Filename      : 99.sh
# * Description   : lueluelue
# **********************************************************
echo ""
for i in $(seq 1 9)
do
        for j in $(seq 1 9)
        do
                echo -n "$i * $j = $[ $i * $j ] "
                if [ $i -eq $j ];then
                echo -e "\n"
                break
                fi
        done
done

7.随机点名,并且之前点过的名字不能重复点到,所有人全被点到后提示,并可开始下一轮点名

#!/bin/bash
# **********************************************************
# * Author        : oldwang
# * Email         : lilulilu6666@163.com
# * Create time   : 2020-12-08 11:08
# * Filename      : 99.sh
# * Description   : lueluelue
# **********************************************************

student_total=$(cat mingdan.txt | wc -l) #人数
sj=$[ $RANDOM % $[ ${student_total} +1 ] ] #随机数除以(人数+1)取余,这样生成的余数正好在1-人数之内.
if [ ! -f yidian.txt ];then
touch yidian.txt
fi

for i in $(seq ${student_total} ) #设定循环范围在1-人数之间
do
        if [ $i -eq $sj ];then  #当i遍历到与生成的随机数相等时
                #从名单中将对应序号的名字取出存放到Full_Name变量中
                Full_Name=$(cat -n mingdan.txt  | grep -w "$sj" | awk '{print $NF}')
                #在yidian.txt文件中过滤上边取出的名字
                grep "$Full_Name" yidian.txt &> /dev/null
                if [ $? -eq 1 ];then
                        #如果yidian.txt中没有,就把该名字追加到yidian.txt中,并在屏幕打印该名字
                        echo "${Full_Name}" >> yidian.txt
                        echo "此次回答问题的同学是: $Full_Name"
               #如果这个名字在yidian.txt文件中已存在,就再执行一遍此脚本
                else
                        sh for_student.sh
                fi
        fi
done
student_yidian=$(cat yidian.txt | wc -l)  #yidian.txt文件的行数
if [ ${student_total} -eq ${student_yidian} ];then  #当yidian.txt文件中的名字数与名单中的名字数相等时
rm -f yidian.txt  #移除yidian.txt文件,并输出所有名字都被点过的信息
echo "所有同学都已被点过一次,开始下个轮回!"
touch yidian.txt
fi


版权声明:本文为weixin_41690116原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。