Shell 脚本中的循环语句、函数与数组

news2024/9/20 6:24:18

文章目录

  • Shell 脚本中的循环语句、函数与数组
    • 1. `for` 循环
      • 1.1 `for` 循环语法结构
        • 1.1.1 列表循环
        • 1.1.2 不带列表循环
        • 1.1.3 类C风格的`for`循环
      • 1.2 案例
        • 1.2.1 打印1-5这5个数字
        • 1.2.2 打印5次hello world
        • 1.2.3 打印abcde
        • 1.2.4 输出0-50之间的偶数
      • 1.3 小技巧:花括号 `{}` 和 `seq` 在 `for` 循环的应用
      • 1.4 实际案例
        • 1.4.1 批量添加用户
        • 1.4.2 根据IP地址列表检查主机状态
        • 1.4.3 根据IP地址段检查主机状态
    • 2. `while` 循环
      • 2.1 `while` 循环的语法结构
      • 2.2 死循环
        • 2.2.1 写一个永远为真的表达式
        • 2.2.2 使用 `true`
        • 2.2.3 使用 `:`(空命令)
      • 2.3 案例
        • 2.3.1 打印1-5
        • 2.3.2 输出1-100之间不能被3整除的数字
        • 2.3.3 监控某服务(httpd)运行状态
      • 2.4 实际案例
        • 2.4.1 实时监控本机内存和硬盘剩余空间
    • 3. `until` 循环
      • 3.1 语法结构
      • 3.2 案例
        • 3.2.1 计算1-50的和
    • 4. 循环控制语句
      • 4.1 `continue`
        • 4.1.1 案例:打印1-5的数字,3不打印
      • 4.2 `break`
        • 4.2.1 案例:打印1-10的数字,7后面的都不打印
      • 4.3 `exit`
        • 4.3.1 案例:打印1-5的数字,3时退出程序
    • 5. Shell 函数
      • 5.1 函数的定义
        • 5.1.1 函数的定义方法
      • 5.2 函数的调用
      • 5.3 函数的返回值
        • 5.3.1 案例:返回用户输入的数字的两倍
      • 5.4 函数传参
        • 5.4.1 两个数求和
        • 5.4.2 通过脚本传递参数给函数中的位置参数
      • 5.5 函数的递归
        • 5.5.1 计算5的阶乘
    • 6. 数组的定义
      • 6.1 数组的定义方法
      • 6.2 获取数组的长度
      • 6.3 获取数据列表
      • 6.4 数组元素遍历
      • 6.5 数组(元素)替换
      • 6.6 数组删除
      • 6.7 数组排序算法:冒泡排序
        • 6.7.1 基本思想
        • 6.7.2 算法思路
      • 6.8 输入数组元素并排序

Shell 脚本中的循环语句、函数与数组

1. for 循环

1.1 for 循环语法结构

1.1.1 列表循环
for 变量名 in {list}
do
    command
done
1.1.2 不带列表循环
for 变量名
do
    command
done
1.1.3 类C风格的for循环
for ((expr1; expr2; expr3))
do
    command
done

1.2 案例

1.2.1 打印1-5这5个数字
#!/bin/bash
for i in {1..5}
do
    echo $i
done

image-20240804202452922

1.2.2 打印5次hello world
#!/bin/bash
for i in {1..5}
do
    echo hello world
done

image-20240806084638194

1.2.3 打印abcde
#!/bin/bash
for i in a b c d e
do
    echo $i
done

image-20240806084521518

1.2.4 输出0-50之间的偶数
#!/bin/bash
for i in {0..50..2}
do
    echo $i
done

image-20240806084735261

1.3 小技巧:花括号 {}seqfor 循环的应用

  • for i in {1..50..2} 1-50的奇数
  • for i in {2..50..2} 1-50的偶数
  • for i in {10..1} 1-10倒序排列
  • for i in $(seq 10) 1-10正序排列
  • for i in $(seq 10 -1 1) 1-10倒序排列
  • for i in $(seq 1 2 10) 1-10的奇数,中间为步长
  • for i in $(seq 0 2 10) 1-10的偶数,中间为步长

1.4 实际案例

1.4.1 批量添加用户

方法1:以后缀批量变化添加

#!/bin/bash
for i in {1..10}
do
userdel -r xiewei$i
echo "已删除xiewei1-10用户"
done

image-20240806085206109

方法2:脚本批量添加用户

#!/bin/bash
ULIST=$(cat /root/users.txt)
for UNAME in $ULIST
do
    useradd $UNAME
    echo "123456" | passwd --stdin $UNAME &>/dev/null
done

方法3:批量删除用户

#!/bin/bash
ULIST=$(cat /root/users.txt)
for UNAME in $ULIST
do
    userdel -r $UNAME &>/dev/null
done

image-20240806085928716

1.4.2 根据IP地址列表检查主机状态
#!/bin/bash
HLIST=$(cat /root/ipadds.txt)
for IP in $HLIST
do
    ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
    if [ $? -eq 0 ]; then
        echo "Host $IP is up."
    else
        echo "Host $IP is down."
    fi
done

image-20240806091109604

1.4.3 根据IP地址段检查主机状态
#!/bin/bash
network="192.168.10"
for addr in {1..254}
do
    ping -c 2 -i 0.5 -W 3 $network.$addr &> /dev/null
    if [ $? -eq 0 ];then
        echo "$network.$addr is up"
    else
        echo "$network.$addr is down"
    fi
done

image-20240806092106737

2. while 循环

2.1 while 循环的语法结构

while 表达式
do
    command
done

2.2 死循环

2.2.1 写一个永远为真的表达式
while [ 1 -eq 1 ]
do
    command
done
2.2.2 使用 true
while true
do
    command
done
2.2.3 使用 :(空命令)
while :
do
    command
done

2.3 案例

2.3.1 打印1-5
#!/bin/bash
i=1
while [ $i -le 5 ]
do
    echo $i
    let i++
done
echo "最后i的值为: $i"

image-20240806093307331

2.3.2 输出1-100之间不能被3整除的数字
#!/bin/bash
i=1
while [ $i -le 100 ]
do
    if [[ $i%3 -ne 0 ]]
    then 
        echo "$i"
    fi
    let i++
done

image-20240806093734804

2.3.3 监控某服务(httpd)运行状态
while ps aux | grep httpd | grep -v grep &> /dev/null
do
    echo "httpd 正在运行中"
    sleep 2
done
echo "httpd 不在运行"

image-20240806094807184

2.4 实际案例

2.4.1 实时监控本机内存和硬盘剩余空间
#!/bin/bash
#提取根分区剩余空间
disk_size=$(df / | awk '/\//{print $4}')
#提取内存剩余空间
mem_size=$(free | awk '/Mem/{print $4}')
while :
do
    #注意内存和磁盘提取的空间大小都是以Kb 为单位
    if [ $disk_size -le 512000 -a $mem_size -le 1024000 ];then 
        mail -s "Warning" root <<EOF
Insufficient resources,资源不足
EOF
    fi 
done

image-20240806095403591

3. until 循环

until 循环和 while 循环相反,条件为假进入循环,条件为真退出循环。

3.1 语法结构

until 表达式
do
    command
done

3.2 案例

3.2.1 计算1-50的和
#!/bin/bash
i=0
s=0
until [ $i -eq 51 ]
do
    let s+=i
    let i++
done
echo $s

image-20240806095729117

4. 循环控制语句

4.1 continue

continue 语句用于跳过本次循环的剩余部分,重新开始下一次循环。

4.1.1 案例:打印1-5的数字,3不打印
#!/bin/bash
for ((i=1;i<=5;i++))
do
    if [ $i -eq 3 ];then
        continue
    else
        echo $i
    fi
done

image-20240806100242888

4.2 break

break 语句用于立即停止循环,并执行循环体外的代码。

4.2.1 案例:打印1-10的数字,7后面的都不打印
#!/bin/bash
for ((i=1;i<=10;i++))
do
    if [ $i -eq 8 ];then
        break
    else
        echo $i
    fi
done

image-20240806100440244

4.3 exit

exit 语句用于立即退出脚本,并返回一个状态码。

4.3.1 案例:打印1-5的数字,3时退出程序
for i in {1..5}
do
    if [ $i -eq 3 ];then
        exit 100 
    else
        echo $i
    fi
done
echo hi

image-20240806100602520

5. Shell 函数

5.1 函数的定义

5.1.1 函数的定义方法

方法1:

function 函数名 {
    command
}

方法2:

函数名() {
    command
}

5.2 函数的调用

直接在脚本里定义函数的代码块后写函数名即可完成调用。

#!/bin/bash
function fun1 {
    echo "this is a function!"
}

fun1

image-20240809160632529

5.3 函数的返回值

return 表示退出函数并返回一个退出值,脚本中可以用 $? 变量显示该值。

5.3.1 案例:返回用户输入的数字的两倍
#!/bin/bash
function

 test1 {
    read -p "请输入一个数字:" num
    return $[$num*2]
}
test1
echo $?

image-20240809161350326

5.4 函数传参

5.4.1 两个数求和
#!/bin/bash
sum(){
    read -p "请输入第一个数:" NUM1
    read -p "请输入第二个数:" NUM2
    echo "你输入的两个数为: $NUM1$NUM2 "
    SUM=$(( NUM1 + NUM2 ))
    echo "两个数的和为: $SUM"
}
sum

image-20240809162639566

5.4.2 通过脚本传递参数给函数中的位置参数
#!/bin/bash
add (){
    let sum=$1+$2
    echo $sum
}

add $1 $2   # 调用脚本时传递参数
add 20 30

image-20240809163210386

5.5 函数的递归

5.5.1 计算5的阶乘
#!/bin/bash
fa () {
    if [ $1 -eq 1 ]
    then
        echo 1
    else
        local tp=$[$1 - 1]
        local res=$(fa $tp)
        echo $[$1 * $res]
    fi
}

read -p "请输入:" num
res=$(fa $num)
echo $res

image-20240809165547715

6. 数组的定义

6.1 数组的定义方法

方法1:

num=(11 22 33 44)

方法2:

num=([0]=55 [1]=66 [2]=77 [4]=88)

方法3:

list="11 12 13 14"
num=($list)

方法4:

数组名[0]="value"
数组名[1]="value"
数组名[2]="value"

6.2 获取数组的长度

arr_length=${#arr_number[*]}

6.3 获取数据列表

echo ${arr_number[*]}
echo ${arr_number[@]}

6.4 数组元素遍历

#!/bin/bash
arr=(1 2 3 4 5 6)
for i in ${arr[*]}
do
    echo $i
done

image-20240809171105179

6.5 数组(元素)替换

arr=(1 2 3 4 5)
echo ${arr[@]/3/55}   # 替换元素3为55
echo ${arr[@]}
arr=(${arr[@]/3/55})  # 实现改变原有数组,如果注释掉原数组不变。
echo ${arr[@]}

image-20240809171351965

6.6 数组删除

arr=(1 2 3 45)
unset arr            # 删除数组
echo ${arr[*]}

arr=(1 2 3 4 5)
unset arr[4]         # 删除第四个元素
echo ${arr[*]}

image-20240809171827037

6.7 数组排序算法:冒泡排序

6.7.1 基本思想

冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部。

6.7.2 算法思路
#!/bin/bash
array=(90 70 60 40 50 30)
echo "old_array:${array[*]}"
lt=${#array[*]}
# 定义比较轮数,比较轮数为数组长度减1,从1开始
for ((i=1; i<$lt; i++))
do
    # 确定比较元素的位置,比较相邻两个元素,较大的数往后放,比较次数随比较轮数而减少
    for ((j=0; j<$lt-i; j++))
    do
        # 定义第一个元素的值
        first=${array[$j]}
        # 定义第二个元素的值
        k=$[$j+1]
        second=${array[$k]}
        # 如果第一个元素比第二个元素大就互换
        if [ $first -gt $second ]
        then
            # 把第一个元素值保存到临时变量中
            temp=$first
            # 把第二个元素值赋给第一个元素
            array[$j]=$second
            # 把临时变量(也就是第一个元素原值)赋给第二个元素
            array[$k]=$temp
        fi
    done
done
# 输出排序后的数组
echo "new_array:${array[*]}"

image-20240809174544545

6.8 输入数组元素并排序

#!/bin/bash
# 存入元素
k=0
while true
do
    read -p "是否继续存入元素:" doing
    if [ $doing == "no" ];then
        break
    fi
    read -p "请输入第$[$k+1]个元素:" key
    score[$k]=$key
    let k++
done
# 外层为轮
for ((i=1;i<${#score[*]};i++));do
    # 内层为次
    for ((j=0;j<${#score[*]}-i ;j++));do
        # 两数交换
        if [ ${score[$j]} -gt ${score[`expr $j + 1`]} ];then
            tmp=${score[`expr $j + 1`]}
            score[`expr $j + 1`]=${score[$j]}
            score[$j]=$tmp
        fi
    done
done
echo ${score[*]}

ray:${array[*]}"


[外链图片转存中...(img-DSf2up1f-1723197200361)]

### 6.8 输入数组元素并排序

```bash
#!/bin/bash
# 存入元素
k=0
while true
do
    read -p "是否继续存入元素:" doing
    if [ $doing == "no" ];then
        break
    fi
    read -p "请输入第$[$k+1]个元素:" key
    score[$k]=$key
    let k++
done
# 外层为轮
for ((i=1;i<${#score[*]};i++));do
    # 内层为次
    for ((j=0;j<${#score[*]}-i ;j++));do
        # 两数交换
        if [ ${score[$j]} -gt ${score[`expr $j + 1`]} ];then
            tmp=${score[`expr $j + 1`]}
            score[`expr $j + 1`]=${score[$j]}
            score[$j]=$tmp
        fi
    done
done
echo ${score[*]}

image-20240809175039558

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1995776.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣爆刷第171天之TOP200五连刷121-125(跳跃游戏、买卖股票、旋转链表)

力扣爆刷第171天之TOP200五连刷121-125&#xff08;跳跃游戏、买卖股票、旋转链表&#xff09; 文章目录 力扣爆刷第171天之TOP200五连刷121-125&#xff08;跳跃游戏、买卖股票、旋转链表&#xff09;一、55. 跳跃游戏二、123. 买卖股票的最佳时机 III三、排序奇升偶降链表四、…

【mysql 第四篇章】bin log 的作用是啥呢?

一、redo Log 介绍 redo log 是一种偏向物理性质的重做日志&#xff0c;因为他里面记录类似的这样的东西&#xff0c;“对那个数据也中的什么记录&#xff0c;做了个什么修改”。它是 InnoDB 存储引擎特有的东西。 二、bin Log 日志 bin log 叫做归档日志&#xff0c;它里面…

pytorch多GPU训练简明教程

1. Torch 的两种并行化模型封装 1.1 DataParallel DataParallel 是 PyTorch 提供的一种数据并行方法&#xff0c;用于在单台机器上的多个 GPU 上进行模型训练。它通过将输入数据划分成多个子部分&#xff08;mini-batches&#xff09;&#xff0c;并将这些子部分分配给不同的 G…

软件测试面试200问(含答案+文档)

1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自己&…

旋转图像

旋转图像 思路&#xff1a; 第一意识是找一个数学规律&#xff0c;一个公式可以找到对应的位置。 唉 想不出 没啥思路 看题解了。 一看就懂了 规律就是。。。。。。&#xff1a;原来第 i 行第 j 列的元素 在旋转后 会在第 j 行倒数第i列。 这种题目做少了&#xff0c;多做…

正点原子安装buildroot构建根文件系统

1&#xff1a;何为 buildroot&#xff1f; 1.1&#xff1a;buildroot 简介 在《第三篇 系统移植篇》我们最后讲解了如何使用 busybox 构建文件系统&#xff0c;busybox 仅仅 只是帮我们构建好了一些常用的命令和文件&#xff0c;像 lib 库、/etc 目录下的一些文件都需要我们自…

初识Spring、SpringIOC

Spring 一、什么是Spring框架&#xff1f;(重要) ---对Spring的理解 记忆关键字&#xff1a;1.核心思想&#xff08;IOC、AOP&#xff09; 2.作用&#xff08;解耦、简化&#xff09; 3.简单描述框架组成 答&#xff1a;定义&#xff1a;Spring是一个轻量级的控制反转(IoC)和…

SpringBoot中解决文件application.properties中文注释乱码的问题

如图看到中文注释乱码 很影响代码的阅读 原因是字符编码使用了ISO-8859-1 这里演示如何在idea里面把ISO-8859-1改为UTF-8 点击右上角设置 搜索框输入UTF-8 把默认的改成UTF-8就行了 可以看到中文注释正常显示 希望能够点点赞和收藏&#xff01;&#xff01;

猫咪浮毛大作战!希喂、安德迈宠物空气净化器PK,实测数据大公开

宠物空气净化器作为宠物领域的新产品&#xff0c;凭借自身独特的功能受到铲屎官们的喜爱&#xff0c;越来越多的商家关注到这个市场。然而&#xff0c;市面上品牌逐渐增多&#xff0c;质量却参差不齐&#xff0c;一些不良商家以次充好&#xff0c;容易让消费者陷入消费陷阱。因…

PHYS_OPT_MODIFIED

当对原始单元执行物理优化时&#xff0c;PHYS_OPT_MODIFIED 更新单元的属性以反映对单元执行的优化。什么时候&#xff1f; 对同一单元格执行多次优化&#xff0c;PHYS_OPT_MODIFIED值 包含按发生顺序排列的优化列表。 架构支持 所有架构。 适用对象 PHYS_OPT_MODIFIED属性放置…

Linux嵌入式学习——C++学习(2)

一、标识符的作用域和可见性 &#xff08;一&#xff09;作用域 1、全局作用域 在函数外部声明的变量和函数具有全局作用域。这些变量和函数在程序的任何地方都可以被访问。 2.局部作用域 在函数内部、循环体内部或条件语句内部声明的变量具有局部作用域。这些变量只能在其…

<数据集>航拍屋顶识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;3516张 标注数量(xml文件个数)&#xff1a;3516 标注数量(txt文件个数)&#xff1a;3516 标注类别数&#xff1a;1 标注类别名称&#xff1a;[roof] 序号类别名称图片数框数1roof351643938 使用标注工具&#xf…

模具3D打印:成本缩减与产能提升的新引擎

近年来&#xff0c;3D打印技术&#xff0c;特别是在航空航天、汽车制造、生物医疗等前沿领域&#xff0c;已成为复杂结构件研发与生产的关键技术。针对广大制造企业而言&#xff0c;评估金属3D打印技术的经济效能&#xff0c;即其能否有效助力企业成本控制与产能提升&#xff0…

魔众文库系统v7.0.0版本推荐店铺功能,管理菜单逻辑优化

推荐店铺功能&#xff0c;管理菜单逻辑优化 [新功能] RandomImageProvider 逻辑升级重构&#xff0c;支持更丰富的随机图片生成 [新功能] 资源篮订单参数字段 [新功能] 首页推荐店铺功能&#xff0c;需要在后台 文库系统 → 文库店铺 开启推荐 [系统优化] Grid 快捷编辑请求…

Yolo-World初步使用

Yolo v8目前已经支持Yolo-World&#xff0c;整理一下初步使用步骤。 使用步骤 1 先下载Yolo-World的pt文件&#xff0c;下载地址&#xff1a;GitHub - AILab-CVC/YOLO-World: [CVPR 2024] Real-Time Open-Vocabulary Object Detection 官网应该是点这里&#xff08;有个笑脸…

C++入门:C语言到C++的过渡

前言&#xff1a;C——为弥补C缺陷而生的语言 C起源于 1979 年&#xff0c;当时 Bjarne Stroustrup 在贝尔实验室工作&#xff0c;面对复杂软件开发任务&#xff0c;他感到 C 语言在表达能力、可维护性和可扩展性方面存在不足。 1983 年&#xff0c;Bjarne Stroustrup 在 C 语言…

大数据应用型产品设计方法及行业案例介绍(可编辑110页PPT)

引言&#xff1a;随着信息技术的飞速发展&#xff0c;大数据已成为推动各行各业创新与变革的重要力量。大数据应用型产品&#xff0c;作为连接海量数据与实际应用需求的桥梁&#xff0c;其设计方法不仅要求深入理解数据特性&#xff0c;还需精准把握用户需求&#xff0c;以实现…

git:安装 / 设置环境变量 / 使用

一、下载 https://github.com/git-for-windows/git/releases/download/v2.45.1.windows.1/Git-2.45.1-64-bit.exe 下载成功-双击打开 下一步-Next 二、添加环境变量 1、找到git安装地址 win r cmd 回车 where git 设置环境变量 C:\Program Files\Git\cmd\git.exe 此电…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 最大括号深度(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是 春秋招笔试突围 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,…

分布式事务学习整理

一、整体背景 最近在分布式事务领域这块的了解比较少&#xff0c;对自己来说是一个业务盲点&#xff0c;所以想抽空学习以及整理下关于分布式事务的相关知识。 1、分布式事务的发展 总所周知&#xff0c;我们为什么要考虑分布式事务&#xff0c;从一开始发展来说&#xff0c…