shell脚本 ( 函数 数组 冒泡排序)

news2025/2/22 18:59:51

目录

 什么是函数

使用函数的方法

格式

注意事项

函数的使用

函数可以直接使用

函数变量的作用范围

函数返回值

查看函数

删除函数

函数的传递参数

使用函数文件

​编辑

拓展递归函数

例:求5的阶乘 

什么是数组

使用数组的方法

1.先声明

2.定义数组

3.查看数组

显示数组值个数

显示数组全部下标

4.调用数组 

5.删除数组

数组切片

遍历数组(可以用来随机点名)

随机数比较大小

​编辑

冒泡排序


 什么是函数

在Linux中,函数是一个可重复使用的代码块,用于执行特定任务。函数通常被定义为一个具有特定名称的代码块,并可以接受输入参数和返回值。通过使用函数,可以将代码分解为更小的逻辑块,提高代码的可读性、可维护性和重用性

函数是脚本的别名

使用函数可以避免代码重复,增加可读性

使用函数的方法

1.定义函数

2.引用函数

格式

1.函数名() {

  脚本

}

2.function 函数名() {

脚本

}

3.function 函数名 (

注意事项

1.直接写 函数中调用函数 直接写函数名

2.同名函数 后一个生效

3.调用函数一定要先定义

4.每个函数是独立

函数的使用

函数可以直接使用

a() { cd /qqq;ls;}  #定义函数a


 

函数变量的作用范围

name=

local name= (函数名)

local    关键词 可以让变量只在函数中生效,

不会影响外界环境

函数返回值

如果使用函数

$? 使用就会受限

我们使用 return 自定义$?的返回值来判断 

函数中的命令是否成功

user () {
if [ $1 = root ]
then
echo "你好管理员"
return 30   #是管理员返回值为30
else
echo "你不是管理员"
return 20   #不是管理员返回值为20
fi
}
user $1
echo $?

查看函数

declare -f  函数名

[root@localhost/qqq] # declare -f qwer  #查看qwer函数
qwer () 
{ 
    cd /qqq;
    ls --color=auto
}

删除函数

ufunc_name

[root@localhost/qqq] # qwer      #函数qwer可以调用
10.sh       2.sh  7.sh  f.sh       random_data
11.sh       3.sh  8.sh  hostoff    v.sh
12.sh       4.sh  9.sh  hoston     x.sh
1.sh        5.sh  b.sh  mv.sh      xxx.txt
2023-11-21  6.sh  c.sh  name1.txt  z.sh
[root@localhost/qqq] # unset func_name qwer  #删除函数qwer
[root@localhost/qqq] # qwer  #无法调用
bash: qwer: 未找到命令...

函数的传递参数

需注意

脚本 $1 $2

函数$1 $2

是没有关系

函数的$1 $2 是指跟在函数后面的值

#!/bin/bash
sum1 (){
echo $1 
echo $2
}


sum1 $2 $1

使用函数文件

ostype (){          #定义函数
   if  grep -i -q "linux 6" /etc/os-release
   then
   echo "centos6"
   elif grep -i -q "linux 7" /etc/os-release
   then
   echo "centos7"
   elif grep -i -q "linux 8"  /etc/os-release
   then
   echo "centos8"
  else
  echo  "not linux"
  fi
  }

拓展递归函数

函数自己调用自己本身的函数

阶乘

例:求5的阶乘 

4的阶乘结果*5

3的阶乘结果*4

2的阶乘结果*3

1的阶乘结果*2

1的阶乘结果就是1

#!/bin/bash
sum=1
read -p "请输入一个数字:" num
for i in `seq $num`
do
let sum=$[i*sum]
done
echo $sum


fact() {
  if [ $1 -eq 1 ]
  then
    echo 1
  else
   local temp=$[$1 - 1]
   local result=$(fact $temp)
   echo $[$1 * $result]
fi
}
read -p "请输入:" n
fact $n

什么是数组

在Linux中,数组是一种数据结构,它用于存储一系列有序的元素。数组是一种线性数据结构,它可以用来存储相同类型的元素,这些元素按照顺序排列,每个元素都有一个唯一的索引,从0开始。

使用数组的方法

1.先声明

declare -a    普通数组 (不需要手动声明,系统帮你声明好了的)

declare -A    数组名      (关联数组一定要手动声明)

2.定义数组

1.数组名= (数组值,中间用空格隔开)

[root@localhost~] # xxx=( 10 20 30 )

2.数组名 [下标1] =值1

   数组名 [下标2] =值2

  ................

数组名 [下标n] 值n

3.查看数组

echo  ${数组名[@]}            echo ${数组名[*]}

[root@localhost~] # echo ${xxx[*]}     #xxx为数组名
10 20 30
[root@localhost~] # echo ${xxx[@]}
10 20 30

显示数组值个数

echo  $ {#数组名[@]}        echo ${#数组名[*]}        

[root@localhost~] # echo ${#xxx[@]}   #数组名为xxx
3
[root@localhost~] # echo ${#xxx[*]}
3

显示数组全部下标

echo ${!数组名[@]}       echo ${!数组名[*]}

[root@localhost~] # echo ${!xxx[@]}
0 1 2
[root@localhost~] # echo ${!xxx[*]}
0 1 2

4.调用数组 

单个调用 echo ${数组名[0]}     调用第一个值    (调用数组值从0开始为第一个值)

[root@localhost~] # xxx=( 10 20 30 )  #定义数组

[root@localhost~] # echo ${xxx[0]}    #调用第一个数组
10
[root@localhost~] # echo ${xxx[1]}   #调用第二个数组
20
[root@localhost~] # echo ${xxx[2]}    #调用第三个数组
30

5.删除数组

unset  数组名   

[root@localhost~] # unset xxx
[root@localhost~] # echo ${xxx[@]}

单个删除 unset 数组名 [0下标]   (删除数组值从0开始为第一个值)

[root@localhost~] # xxx=(10 20 30)   #定义数组xxx
[root@localhost~] # echo ${xxx[@]}   #查看数组
10 20 30
[root@localhost~] # unset xxx[0]     #删除数组第一个值
[root@localhost~] # echo ${xxx[@]}   #查看数组
20 30

数组切片

echo ${数组名[@]:2:2}   (跳过前面2个往后取2个)

[root@localhost~] # a=(10 20 30 40 50 60)  #定义数组
[root@localhost~] # echo ${a[@]:2:2}   #跳过前面2个往后取2个
30 40
[root@localhost~] # echo ${a[@]:3:3}    #跳过前面3个取后面2个
40 50 60

遍历数组(可以用来随机点名)

#!/bin/bash  

# 定义一个数组  
a=(apple banana orangen rape kiwi)
b=$(echo $[RANDOM%5])   #随机数
# 遍历数组并输出每个元素  
echo "${a[$b]}"

随机数比较大小

#!/bin/bash
for i in {0..9}    #变量i在0到9之间循环
do
a[$i]=$RANDOM            #建立数组a ,变量i是下标对应一次建立随机的数组值
[ $i -eq 0 ] && min=${a[0]} && max=${a[0]}   #当下标为0时,定义其对标的数组值同时为最大和最小
[ ${a[$i]} -gt $max ] && max=${a[$i]}
[ ${a[$i]} -lt $min ] && min=${a[$i]}     
 #当下标为1时,下标对应的随机数会与当前的最大值与最小值作比较。比最大值大的,为最大值,比最小值小的,则为最小值。
done
echo "所有随机数为:${a[*]}"
echo "最大数为:$max"
echo "最小数为:$min"

冒泡排序

双重循环

内循环比较相邻数的大小找到最大数

#!/bin/bash
#生成一个随机数组

for  i  in {0..9}
do
  a[$i]=$RANDOM
done

echo "原始数组为: ${a[@]}"

l=${#a[@]}
#定义变量l为数组a的长度10
for((i=1;i<$l;i++))
#需要比较的轮次   
do
   for ((j=0;j<$l-$i;j++))
   #相邻的数需 要比较的次数
   do
   first=${a[$j]}
   #数组的第一个数  
   k=$[$j+1]
   #计算数组 下一个数的 下标   
   second=${a[$k]}
   #下一个数
   if [ $first  -gt  $second ]
   #如果第一个数大于第二个数
   then
   temp=$first
   a[$j]=$second   
   #第二个数就为下一次比较的第一个数 
   a[$k]=$temp
   #第一个数就成为第二大的数
   fi
   done
done

echo "排序后的数组:  ${a[@]}" 

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

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

相关文章

Python---函数的数据---拆包的应用案例(两个变量值互换,*args, **kwargs调用时传递参数用法)

案例&#xff1a; 使用至少3种方式交换两个变量的值 第一种方式&#xff1a;引入一个临时变量 c1 10 c2 2# 引入临时变量temp temp c2 c2 c1 c1 tempprint(c1, c2) 第二种方式&#xff1a;使用加法与减法运算交换两个变量的值&#xff08;不需要引入临时变量&#xff09…

ArcGIS制作广场游客聚集状态及密度图

文章目录 一、加载实验数据二、平均最近邻法介绍1. 平均最近邻工具2. 广场游客聚集状态3. 结果分析三、游客密度制图一、加载实验数据 二、平均最近邻法介绍 1. 平均最近邻工具 “平均最近邻”工具将返回五个值:“平均观测距离”、“预期平均距离”、“最近邻指数”、z 得分和…

C++学习之路(五)C++ 实现简单的文件管理系统命令行应用 - 示例代码拆分讲解

简单的文件管理系统示例介绍: 这个文件管理系统示例是一个简单的命令行程序&#xff0c;允许用户进行文件的创建、读取、追加内容和删除操作。这个示例涉及了一些基本的文件操作和用户交互。 功能概述&#xff1a; 创建文件 (createFile())&#xff1a; 用户可以输入文件名和内…

计算机系统的层次结构与性能指标

目录 一. 计算机系统的层次结构二. 计算机性能指标2.1. 存储器的性能指标2.2 CPU的性能指标2.3 系统整体的性能指标2.4 系统整体的性能指标(动态测试) \quad 一. 计算机系统的层次结构 \quad \quad 虚拟机器的意思是看起来像是机器直接就能执行程序员所写的代码, 其实是需要通过…

Java王者荣耀

一、创建项目 二、代码 package com.sxt;import javax.swing.*; import java.awt.*;public class Background extends GameObject {public Background(GameFrame gameFrame) {super(gameFrame);// TODO Auto-generated constructor stub}Image bg Toolkit.getDefaultToolkit(…

基于helm的方式在k8s集群中部署gitlab - 备份恢复(二)

接上一篇 基于helm的方式在k8s集群中部署gitlab - 部署&#xff08;一&#xff09;&#xff0c;本篇重点介绍在k8s集群中备份gitlab的数据&#xff0c;并在虚拟机上部署相同版本的gitlab&#xff0c;然后将备份的数据进行还原恢复 文章目录 1. 备份2. 恢复到虚拟机上的gitlab2.…

java学习part13Object类和常用方法

1.Object 2.常用方法 2.1clone() clone()就是深拷贝&#xff0c;创建一个同内容新对象。需要实现接口 2.2finalize()已废弃 类似于析构函数&#xff0c;在GC回收之前调用。 System.gc()强制调用gc&#xff0c;然后就能看到finalize()的输出 2.3equals() 对于引用类型可用。…

帮管客CRM SQL注入漏洞复现

0x01 产品简介 帮管客CRM是一款集客户档案、销售记录、业务往来等功能于一体的客户管理系统。帮管客CRM客户管理系统&#xff0c;客户管理&#xff0c;从未如此简单&#xff0c;一个平台满足企业全方位的销售跟进、智能化服务管理、高效的沟通协同、图表化数据分析帮管客颠覆传…

Linux(8):BASH

硬件、核心与 Shell 操作系统其实是一组软件&#xff0c;由于这组软件在控制整个硬件与管理系统的活动监测&#xff0c;如果这组软件能被用户随意的操作&#xff0c;若使用者应用不当&#xff0c;将会使得整个系统崩溃。因为操作系统管理的就是整个硬件功能。 应用程序在最外层…

ELF分析(以CS:APP linkLab的文件为例)

文件结构&#xff1a;gcc -o test main.o phase1.o 可执行文件的段头表&#xff08;又称程序头表&#xff09;&#xff08;用于描述本文件到虚拟内存的映射&#xff09; text文件的段头表如下。 上图有两个LOAD。它们的区别是权限不同。LOAD1是可读可执行&#xff08;这里面存…

拍这个视频把脸都扇肿了,midjourney官网效果复现

我是如何复现midjourney官网首页效果的&#xff1f; 视频讲解地址&#xff1a;[https://www.bilibili.com/video/BV1FQ4y1p7HC/](https://www.bilibili.com/video/BV1FQ4y1p7HC/)原理&#xff0c;过程&#xff0c;代码讲解 大家好&#xff0c;这一集我来讲一下 字符花园里 总结…

ehr人力资源管理系统(实际项目源码)

eHR人力资源管理系统&#xff1a;功能强大的人力资源管理工具 随着企业规模的不断扩大和业务需求的多样化&#xff0c;传统的人力资源管理模式已无法满足现代企业的需求。eHR人力资源管理系统作为一种先进的管理工具&#xff0c;能够为企业提供高效、准确、实时的人力资源管理…

04_MySQL备份与恢复

任务背景 一、真实案例 某天&#xff0c;公司领导安排刚入职不久的小冯同学将生产环境中的数据(MySQL数据库)全部导入到测试环境给测试人员使用。当小冯去拿备份数据时发现&#xff0c;备份数据是1个礼拜之前的。原因是之前运维同事通过脚本每天对数据库进行备份&#xff0c;…

redis key

不管是&#xff1a;规则&#xff0c;还是其他规则&#xff0c;定义好就可以了。其实没有太多要求的。 1&#xff09;冒号分割类似那种yaml在客户端显示树结构 2&#xff09;其他分割类似那种properties在客户端显示列表结构

​重生奇迹mu迷宫攻略​

重生奇迹mu迷宫是一种比较有挑战性的游戏玩法&#xff0c;需要一定的技巧和策略才能完成。以下是一些基本的攻略和技巧&#xff1a; 了解每个迷宫的特点&#xff1a;不同的迷宫有不同的规则和特点&#xff0c;需要根据迷宫的特点来制定合理的策略。在进入迷宫前可以先了解一下…

Unity2D-URP基于ShaderGraph创建带粒子特效的激光光束

文章目录 创建Shader新建Node: UV新建Node: Split......参数说明 基于Shader创建Material创建Line创建粒子系统StartVFX创建粒子材质更改粒子系统的材质设置透明模式设置粒子效果创建一个Beam设置EndVFX效果预览激光光束管理脚本最终预览 创建Shader Create --> Shader Gra…

redis报错3

INFO: Initializing SpringDispatcherServletdispatcherServlet

思维模型 长尾效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。小众需求大价值。 1 长尾效应的应用 1.1 长尾效应在电子商务领域的应用 亚马逊公司是全球最大的电子商务公司之一&#xff0c;它利用长尾效应来销售大量的小众产品&#xff0c;满足消费者…

5、Qt:项目中包含多个子项目(.pro)/子模块(.pri)

一、说明&#xff1a; 在进行项目开发过程中&#xff0c;会涉及子项目/子模块的问题 Qt中使用TEMPLATE subdirs添加多个子项目&#xff1b;子项目可以单独编译生成可执行文件&#xff08;exe&#xff09;或者动态链接库&#xff08;dll&#xff09;等&#xff0c;供其他模块…