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
目录
相关文章
|
1月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
77 1
|
21天前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
45 2
6种方法打造出色的Shell脚本
|
8天前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
29 1
|
12天前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
34 2
|
26天前
|
监控 网络协议 Shell
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
45 6
|
23天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
1月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
67 12
|
1月前
|
存储 运维 监控
自动化运维:使用Shell脚本简化日常任务
【9月更文挑战第35天】在IT运维的日常工作中,重复性的任务往往消耗大量的时间。本文将介绍如何通过编写简单的Shell脚本来自动化这些日常任务,从而提升效率。我们将一起探索Shell脚本的基础语法,并通过实际案例展示如何应用这些知识来创建有用的自动化工具。无论你是新手还是有一定经验的运维人员,这篇文章都会为你提供新的视角和技巧,让你的工作更加轻松。
55 2
|
2月前
|
Shell
shell脚本变量 $name ${name}啥区别
shell脚本变量 $name ${name}啥区别
|
2月前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
488 2