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
目录
相关文章
|
10月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
871 9
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。
|
10月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
939 2
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
418 60
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
472 1
|
10月前
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。
|
12月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
1268 1
|
存储 Unix Shell
确定Shell脚本在操作系统中的具体位置方法。
这对于掌握Linux的文件系统组织结构和路径方面的理解很有帮助,是我们日常工作和学习中都可能使用到的知识。以上讲解详细清晰,应用简便,是每一个想要精通操作系统的计算机爱好者必备的实用技能。
710 17
|
Linux Shell
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
2285 25
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
416 4