shell脚本-for循环语句详解

shell循环-for

for循环默认跳过空行,遇到空行或者空格则不会去理睬

循环分为循环次数是固定的和循环次数不是固定的,固定的有for循环,不固定的有while和until循环

for循环每次都以空格进行分隔,例如 lisi 123,本应该让i变量取一整行,结果却把lisi,123分别赋给了变量,达不到我们预期的效果,即使使用awk命令也同样只会输出lisi,123,因为$2不存在,详细请看036视频中的28分处,可以修改IFS分隔符值,让for处理文件时按回车分隔

IFS:内部字段分隔符

​ 例如修改IFS分隔符为回车,IFS=$’\n’或者IFS’'引号中间必须有回车,否侧会处理失败

break与continue的区别

​ break是跳出循环

​ continue是跳出本次循环

1.for语法结构

​ shell:

​ for 变量名 in 取值列表

​ do

​ 循环体

​ done

​ C语言风格:

​ for ((初值;条件;步长))

​ do

​ 循环体

​ done

for循环的特殊用法

#!/bin/bash
for i
do
	let $sum=$sum+$i
done

执行./for.sh 1 2
	输出3
for i后面不加东西相当于for i in $*也就是所有参数

1.1批量添加网卡接口

for i in {2..20}
do

        ifconfig ens33:$i 192.168.81.$i
done

1.2for实现批量主机ping探测

循环体中的{}&表示将循环体中的命令放到后台执行

wait命令:后台程序运行完后再执行后面的命令

#!/bin/bash
#-------------------实现批量主机ping探测--------------
#20200208
>ip.txt
for i in {2..254}
do
        {
        ip=192.168.81.$i
        ping -c1 -W1 $ip &>/dev/null
        if [ $? -eq 0 ];then
                echo $ip | tee -a ip.txt
        fi
        }&
done
wait
echo "finish........."

1.3从文件中获取ip地址进行探测

for ip in  $(cat ip.txt)
do
        ping -c1 -W1 $ip &>/dev/null
        if [ $? -eq 0 ];then
                echo "$ip is up..."
        else
                echo "$ip is down..."
        fi
done

1.4for实现批量用户创建

#!/bin/bash
#------------实现批量用户-------------------
#20200208
while :
do
        echo -en "\e[35m Please enter user prefix & user password & user numbers [zhangsan 123 10]: \e[0m" 
        read prefix password numbers
        printf "user infomation:
        -----------------------------------------------
        userprefix: $prefix
        userpassword: $password
        usernumbers: $numbers
        -----------------------------------------------
        "
        read -p "Aree you sure create user[y|n|q]: " action
        case $action in
        y|Y)
                break
                ;;
        q)
                exit
                ;;
        esac
done

for i in $(seq -w $numbers)
do
        user=$prefix$i
        id $user &>/dev/null
        if [ $? -eq 0 ];then
                echo "user $user already exists..."
        else
                useradd $user
                echo "$password" |passwd --stdin $user &>/dev/null
                if id $user &>/dev/null;then
             			echo "user is created....."
                fi
        fi
done
                                                 

1.5实现从文件中批量创建用户

#!/bin/bash
#------------------实现文件中批量创建用户-----------------
#20200209

if [ $# -eq 0 ];then
        echo "usage: $(basename $0) file"
        exit 1
fi

if [ ! -f $1 ];then
        echo "error file"
        exit 2
fi

IFS=$'\n'
for line in `cat $1`
do
        user=$(echo "$line" | awk '{print $1}')
        pass=$(echo "$line" | awk '{print $2}')
        id $line &>/dev/null
        if [ $? -eq 0 ];then
                echo "$i is already exists..."
        else
                useradd $user
                echo "$pass" |passwd --stdin $user &>/dev/null
                if [ $? -eq 0 ];then
                        echo "$i is created..."
                fi
        fi
done

1.6批量创建用户改版

对比1.5主要有一下改进

​ 1.如果用户什么都不输入则重新走一遍循环

​ 2.如果用户输入的numbers不是整数则重新循环,并提示参数设置的不对

​ 3.如果用户只输入了用户前缀则也重新循环

#!/bin/bash
while :
do
        echo -en "\e[36m please enter userprefix & userpassword & usernumbers: \e[0m" 
        read userprefix userpassword usernumbers
        cat <<-EOF
        ----------------------------------------------------------------------------
                        user information
                        userprefix: $userprefix
                        userpassword: $userpassword
                        usernumbers: $usernumbers
        ----------------------------------------------------------------------------
        EOF
        if [[ ! "$usernumbers" =~ ^[0-9]+$ ]] && [ -z "$3" ];then
                echo -e "\e[31m error parameter\e[0m"
                echo -e "\e[33mPlease input again\e[0m"
                continue
        fi

        read -p "Are you sure user information[y|n|q]: " action
        case $action in
        y|Y)
                break
                ;;
        q)
                exit 1
        esac
done

for i in $(seq -w $usernumbers)
do
        user=$userprefix$i
        id $user &>/dev/null
        if [ $? -eq 0 ];then
                echo -e "\e[31m user $user already exists... \e[0m"
        else
                useradd $user
                echo "$userpassword" | passwd --stdin $user &>/dev/null
                if [ $? -eq 0 ];then
                        echo -e "\e[32m $user is created....\e[0m"
                fi
        fi

done                                                 

1.7根据模式进行批量用户创建和删除

1.让用户输入用户名前缀、密码、数量
2.$3必须是整数
3.将用户输入的信息打印成菜单
4.询问用户是否确认创建/删除
5.创建完成提示创建/删除成功
6.循环,用户输入的不正常则重新输入
7.如果创建则执行函数创建,删除则执行函数删除

#!/bin/bash
qrxx(){
        if [[ ! $usernumbers =~ ^[0-9]+$ ]];then
                echo -e "\e[31merror parameter\e[0m"
                continue
        fi

        cat <<-EOF
        +---------------------------------------------------------+
                        user information                         
                        userprefix: $userprefix                   
                        userpass: $userpass                       
                        usernumbers: $usernumbers                       
        +---------------------------------------------------------+
        EOF
}
create(){
        echo -en "\e[034mplease enter userprefix userpass usernumbers[ user 123 10 ]: \e[0m"
        read userprefix userpass usernumbers
        qrxx
        echo -en "\e[35mare you sure create user infomation [y|n] \e[0m"
        read action
        case $action in
        y|Y)
                for i in `seq -w $usernumbers`
                do
                        user=$userprefix$i
                        id $user &>/dev/null
                        if [ $? -ne 0 ];then
                                useradd $user
                                echo "$userpass" |passwd --stdin $user &>/dev/null
                                if [ $? -eq 0 ];then
                                        echo "$user is created..."
                                fi
                        else
                                echo "$user already exists..."
                        fi
                done
                ;;
        n|N)
                continue
                ;;
        *)
                echo "error action,please input [y|n]."
        esac
        #echo "Parameter is not complete"
}

delete(){
        echo -en "\e[034mplease enter userprefix  usernumbers[ user  10 ]: \e[0m"
        read userprefix  usernumbers
        qrxx
        echo -en "\e[35mare you sure delete user information [y|n]: \e[0m"
        read action
        case $action in
        y|Y)
                for i in $(seq -w $usernumbers)
                do
                        user=$userprefix$i
                        id $user &>/dev/null
                        if [ $? -eq 0 ];then
                                userdel -r $user
                                if [ $? -eq 0 ];then
                                        echo "$user is deleted..."
                                fi
                        else
                                echo "$user is not exists... "
                        fi
                done
                ;;
        n|N)
                continue
        esac
}

while :
do
        cat <<-EOF
        +---------------------------------------------------------+
        |                       MENU                              |
        |               1.Batch to create user                    |
        |               2.Batch delete user                       |
        |               q.exit                                    |     
        +---------------------------------------------------------+
        EOF
        echo -en "\e[33mPlease input you want to choose the mode: \e[0m" 
        read mode
        case $mode in
        1)
                create
                ;;
        2)
                delete
                ;;
        q)
                exit
                ;;
        *)
                echo "error"
        esac
done

你可能感兴趣的:(shell脚本)