shell脚本-for循环语句详解

简介: shell循环-forfor循环默认跳过空行,遇到空行或者空格则不会去理睬循环分为循环次数是固定的和循环次数不是固定的,固定的有for循环,不固定的有while和until循环for循环每次都以空格进行分隔,例如 lisi 123,本应该让i变量取一整行,结果却把lisi,123分别赋给了变量,达不到我们预期的效果,即使使用awk命令也同样只会输出lisi,123,因为$2不存在,详细请看036视频中的28分处,可以修改IFS分隔符值,让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


1.1批量添加网卡接口

#!/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
目录
相关文章
|
19天前
|
分布式计算 Hadoop Shell
使用shell脚本实现自动SSH互信功能
使用shell脚本实现自动SSH互信功能
25 1
|
3天前
|
存储 算法 安全
shell 脚本之 函数与数组
shell 脚本之 函数与数组
|
3天前
|
机器学习/深度学习 Shell Perl
shell 脚本循环语句
shell 脚本循环语句
|
3天前
|
机器学习/深度学习 Ubuntu Shell
shell 脚本 条件语句
shell 脚本 条件语句
|
3天前
|
监控 搜索推荐 Shell
|
19天前
|
Unix Shell Linux
轻松编写 AIX Shell 脚本
轻松编写 AIX Shell 脚本
15 1
|
19天前
|
监控 关系型数据库 Shell
Shell脚本入门:从基础到实践,轻松掌握Shell编程
Shell脚本入门:从基础到实践,轻松掌握Shell编程
|
19天前
|
关系型数据库 MySQL Shell
在Centos7中利用Shell脚本:实现MySQL的数据备份
在Centos7中利用Shell脚本:实现MySQL的数据备份
|
19天前
|
Shell Linux 编译器
C语言,Linux,静态库编写方法,makefile与shell脚本的关系。
总结:C语言在Linux上编写静态库时,通常会使用Makefile来管理编译和链接过程,以及Shell脚本来自动化构建任务。Makefile包含了编译规则和链接信息,而Shell脚本可以调用Makefile以及其他构建工具来构建项目。这种组合可以大大简化编译和构建过程,使代码更易于维护和分发。
32 5
|
19天前
|
Shell 程序员 数据安全/隐私保护
shell 脚本 if-else判断 和流程控制 (基本语法|基础命令)
shell 脚本 if-else判断 和流程控制 (基本语法|基础命令)