Linux ---- Shell编程之函数与数组

目录

一、函数

1、函数的基本格式

2、查看函数列表

3、删除函数

4、函数的传参数

5、函数返回值

实验:

1.判断输入的ip地址正确与否

2. 判断是否为管理员用户登录

6、函数变量的作用范围

7、函数递归(重要、难点)

实验:

递归遍历目录

​编辑一键安装nginx 

阶乘

1.用for循环求阶乘

2.用函数求阶乘​编辑

附加:sed

二、数组

1、数组介绍

2、引言

3、shell数组的定义

4、定义数组格式

方法一:

方法二:

方法三:

实验:

 简单随机点名

方法一:

方法二:

 5、数组索引

6、数组定义方法

实验:取最大值

7、冒泡排序法:

举例:


一、函数

  • 将命令序列按格式写在一起
  • 可以方便重复使用命令序列
  • 函数也是一种脚本的别名

使用函数

1、先进性定义

2、再调用

1、函数的基本格式

[function] 函数名(){
  命令序列
[return x]                           #使用return或exit可以显示的结束函数 
}


或者
-------------------------------第二种使用较多---------------------------------------------------
                                     #也可以省略掉[function],它表示该函数的功能

函数名() {                            #函数名后面()是没有内容的
  命令序列                            #我们执行的命令内容放在{}里面
}

----------------------------------------------------------------------------------
[function] 函数名 {
  命令序列

}
  • 函数定义完之后并不会自动执行,需要调用才行
  • 好处在于可以写一段功能代码作为函数,有需要就直接调用定义的时候哪怕出现语法错误也没关系,不调用就不会报错
  • 当然我们写函数最终目的还是为了调用,为了实现某个功能块。

举例:

#!/bin/bash
h () {
echo "hello"
}

niao () {
echo `h` `w`
}

w () {
echo "world"
}

nihao

 

最简单的例子

vim  func.sh


#!/bin/bash

haha () {

echo "hello"

}

haha
#这个是调用hello

bash func.sh

123

如果在其他文件中调用这个文件

添加颜色

2、查看函数列表

declare  -F                  ##查看当前已定义的函数名

declare  -f                  ##查看当前已定义的函数定义

declare  -f  func_name      ##查看指定当前已定义的函数名

declare  -F  func_name      ##查看当前已定义的函数名定义

3、删除函数

删除函数:   unset func_name

[root@localhost data]#func1 () { hostname;hostname -I; }
[root@localhost data]#func1
localhost.localdomain
20.0.0.100 192.168.122.1 
[root@localhost data]#unset func1
[root@localhost data]#func1
bash: func1: 未找到命令...

4、函数的传参数

#!/bin/bash

h () {
echo "第一个参数是:$1 $2 $3"

}

h $1 $2 $3       ##调用

调换位置

#!/bin/bash

h () {
echo "第一个参数是:$1 $2 $3"

}

h $2 $1 $3       ##调用

5、函数返回值

实验:

1.判断输入的ip地址正确与否

使用原则:

1、函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
2、退出状态码必须是0~255,超出时值将为除以256取余

return        ###只能用在函数中
###return      从函数中返回,用最后状态命令决定返回值
###return 0    无错误返回
###return 1    有错误返回

exit 100      ##exit退出整个脚本

 

2. 判断是否为管理员用户登录

6、函数变量的作用范围

函数在Shell脚本中仅在当前Shell环境中有效
Shell脚本中变量默认全局有效
将变量限定在函数内部使用local命令

7、函数递归(重要、难点)

调用自己本身的函数

可以写病毒

[root@localhost ~]#func () { echo $i;echo "run fast";let i++; func; }

func

for炸弹

:(){ :|:& };:                         //:就是一个字符 可以写成单词
bomb() { bomb | bomb & }; bomb

执行bomb以后会死机,除非重启,在没有其他办法。

实验:

递归遍历目录

一键安装nginx 

阶乘

0和1的阶乘都为1

自然数n的阶乘写作n!

1.用for循环求阶乘

2.用函数求阶乘

附加:sed

sed  -i   “s/旧/新/g”   文件名      ###  -i   选项是真的改

#sed -i "s/root/admin/g"  passwd
#当面文件夹下的passwd里的root改为admin

sed  -i.bak  "s/admin/root/g" passwd    ### -i.bak 是做备份,.bak只是后缀名,可以任意写

sed "2a/hahahahaha"  passwd        ### a是插入的意思,2a是在第二行后面插入

sed

  • i    :在前面插
  • a   :在后面插
  • c   :整行替换

二、数组

1、数组介绍

数组和变量:

  • 数组:储存多个元素的连续的内存空间,相当于多个变量的集合
  • 变量:存储单个元素的内存空间

2、引言

将全班学生定义成一个变量,无法使用普通变量。

  • 普通数组

  • 关联数组

变量和数组

  • 变量:存储单个元素的内存空间

  • 数组:存储多个元素的连续的内存空间,相当于多个变量的集合

数组名和索引

  • 索引的编号从0开始,属于数值索引

  • 索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash 4.0版本之后开始支持

  • bash的数组支持稀疏格式(索引不连续)

3、shell数组的定义

数组中可以存放多个值,Bash Shell 只支持一维数组(不支持多维数组)

数组元素的下标由 0 开始

Shell 数组用括号来表示,元素用"空格"符号分割开

在shell语句中,使用、遍历数组的时候,数组格式要写成 ${arr[@]} 或 ${arr[*]}

4、定义数组格式

方法一:

数组名=(value1 value2 ... valuen)
[root@localhost lyh]#a=(1 2 3 4 5)
[root@localhost lyh]#echo ${a[@]}
1 2 3 4 5
[root@localhost lyh]#echo ${a[*]}
1 2 3 4 5

方法二:

数组名=([0]=value0 [1]=value0 [2]=value0 ...)
[root@localhost lyh]#b=([0]=1 [1]=2 [2]=3 [3]=4 [4]=5)
[root@localhost lyh]#echo ${b[@]}
1 2 3 4 5

方法三:

数组名[0]="value"
数组名[1]="value"
数组名[2]="value"
 
[root@localhost lyh]#c[0]=1
[root@localhost lyh]#c[1]=2
[root@localhost lyh]#c[2]=3
[root@localhost lyh]#c[3]=4
[root@localhost lyh]#echo ${c[@]}
1 2 3 4

实验:

 简单随机点名
方法一:

方法二:

 5、数组索引

数组名和索引

  • 索引的编号从0开始,属于数值索引
  • 索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash  4.0版本之后开始支持
  • bash的数组支持稀疏格式(索引不连续)

索引分为两种:普通索引和关联索引

普通索引:上面解释了

关联索引:①下表可以是文字:称为关联索引  键值对的关系

                  下表可以不连续,称为稀疏格式

 注意:关联数组和普通数组都要先声明,普通可以声明也可以不用声明

            但是关联数组必须要先声明

定义关联数组一定要声明,不声明就没有效果

[root@localhost data]#declare -A 数组名      -A 声明关联数组
[root@localhost data]#declare -a  数组名     -a  声明普通数组, 

不是变量是数组

只能把这个删了重新声明,不声明就会混乱

6、数组定义方法

方法一(一次赋值全部元素):
数组名=(value0 valuel value2 ...)
a=(10 20 30 40 50)


方法二(只赋值特定元素):
数组名=([0]=value[1]=value[2]=value ··)
b=([0]=10[1]=20[21=30)


方法三:
列表名="value0 valuel value2..."
数组名=(S列表名)
[root@localhost data]#b="12345 6"
[root@localhost data]#c=$b
[root@localhost data]#echo ${c[*]}
123456


方法四(一次只赋值一个元素):   追加  修改
数组名[0]="value"
数组名[1]="value"
数组名[2]="value"


方法五:read-a  交互式
[root@localhost datal#touch{1..10}.txt
[root@localhost datal#file=(*.txt)    //当前文件夹下的,所有txt结尾的文件
[root@localhost datal#echo $file
10.txt

实验:

取最大值

取最小值: 

随机数

 

7、冒泡排序法:

数组排序算法:冒泡排序
类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。

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

算法思路:
冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少。

score=(77 13 91 56 88)

两两对比,第1个和第2个比,小的值到前面,大的值到后面。
以此类推。第2个和第3个比,第3个和第4个比,第4个和第5个比

------------第一轮------------
77 13 91 56 88 第一次对比 数组长度-1 第一轮比较往后值, 最大值为91 
13 77 91 56 88 第二次对比 
13 77 91 56 88 第三次对比 
13 77 56 91 88 第四次对比 
13 77 56 88 91
------------第二轮------------
13 77 56 88 91 第一次对比 数组长度-1第二轮比较往后,第二大的数字88 
13 77 56 88 91 第二次对比 
13 56 77 88 91 第三次对比 
13 56 77 88 91
------------第三轮-----------
13 56 77 88 91 第一次对比 数组长度-1第三轮比较往后,第三大的数字77 
13 56 77 88 91 第二次对比 
13 56 77 88 91
------------第四轮-----------
13 56 77 88 91 第一次对比 数组长度-1第四轮比较往后,第四大的数字56 
13 56 77 88 91

举例:

#!/bin/bash
array=(98 76 24 100 35 3)
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[@]}"

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

山西电力市场日前价格预测【2024-01-28】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-01-28&#xff09;山西电力市场全天平均日前电价为280.26元/MWh。其中&#xff0c;最高日前电价为556.88元/MWh&#xff0c;预计出现在18:15。最低日前电价为0.00元/MWh&#xff0c;预计出…

智能分析网关V4智慧机房:视频AI智能安全监管方案

一、背景分析 随着互联网的迅猛发展&#xff0c;机房及其配套设施的数量持续攀升&#xff0c;它们的运行状况对于企业运营效率和服务质量的影响日益显著。作为企业信息化的基石&#xff0c;机房的安全监测与管理的重要性不容忽视。它不仅关乎企业的稳定运营&#xff0c;同时也直…

Android Studio 提示Use app:drawableStartCompat instead of android:drawableStart

每次提交代码时&#xff0c;AS这个老妈子总爱唠叨一堆warning&#xff0c;这些Warning都在讲什么&#xff1f; 1.Use app:drawableStartCompat instead of android:drawableStart 在Android开发中&#xff0c;android:drawableStart和app:drawableStartCompat是两个用于设置…

Java多线程基础-18:线程安全的集合类与ConcurrentHashMap

Java标准库提供了很多集合类&#xff0c;但有一些集合类是线程不安全的&#xff0c;也就是说&#xff0c;在多线程环境下可能会出问题的。常用的ArrayList&#xff0c;LinkedList&#xff0c;HashMap&#xff0c;PriorityQueue等都是线程不安全的&#xff08;Vector, Stack, Ha…

【C语言/数据结构】排序(选择排序,推排序,冒泡排序)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​​​ 目录 选择排序 选择排序 ​编辑…

【开源】基于JAVA语言的学生综合素质评价系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生功能2.2 教师功能2.3 教务处功能 三、系统展示四、核心代码4.1 查询我的学科竞赛4.2 保存单个问卷4.3 根据类型查询学生问卷4.4 填写语数外评价4.5 填写品德自评问卷分 五、免责说明 一、摘要 1.1 项目介绍 基于J…

美睫师睫毛嫁接零基础学习,日式美睫与开花嫁接实战教学

一、教程描述 大家都说女人的钱好挣&#xff0c;这是因为每个女人在每年&#xff0c;都要花很多钱来打扮自己。本套教程是关于日式美睫和开花嫁接的&#xff0c;从零基础学习到店铺经营都有涉及&#xff0c;就做美睫和睫毛嫁接这两项业务&#xff0c;月收入万元以上应该问题不…

ubuntu 22.04 安装mysql-8.0.34

ubuntu 22.04 安装mysql-8.0.34 1、基础安装配置 更新软件包&#xff1a; sudo apt update查看可用软件包&#xff1a; sudo apt search mysql-server安装最新版本&#xff1a; sudo apt install -y mysql-server或者&#xff0c;安装指定版本&#xff1a; sudo apt inst…

202|读书笔记《金融的本质:伯南克四讲美联储》

今天跟朋友聊天&#x1f4ac;&#xff0c;说已经没人看书了&#x1f4d6; 我想&#xff0c; 还是会有人读书的吧。 ​ 一、美联储的起源和使命 1. 第一讲&#xff1a;美国南北战争结束后的40年间&#xff0c;美国经历了6次大的银行体系恐慌&#xff0c;促使其于1913年成立美联储…

第八篇【传奇开心果系列】beeware的toga开发移动应用示例:实现消消乐安卓手机小游戏

传奇开心果博文系列 系列博文目录beeware的toga开发移动应用示例系列博文目录一、项目目标二、安装依赖三、初步实现四、扩展思路五、实现游戏逻辑示例代码六、实现界面设计示例代码七、实现增加关卡和难度示例代码八、实现存档和排行榜示例代码九、实现添加特殊方块和道具示例…

C语言第十一弹---函数(下)

​ ✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 函数 1、嵌套调用和链式访问 1.1、嵌套调用 1.2、链式访问 2、函数的声明和定义 2.1、单个文件 2.2、多个文件 2.3、static 和 extern 2.3.1、static…

第六课:Prompt

文章目录 第六课&#xff1a;Prompt1、学习总结&#xff1a;Prompt介绍预训练和微调模型回顾挑战 Pre-train, Prompt, PredictPrompting是什么?prompting流程prompt设计 课程ppt及代码地址 2、学习心得&#xff1a;3、经验分享&#xff1a;4、课程反馈&#xff1a;5、使用Mind…

08. BI - 万字长文,银行如何做贷款违约的预测,特征处理及学习

本文为 「茶桁的 AI 秘籍 - BI 篇 第 08 篇」 文章目录 课程回顾案例分析案例实战 Hi&#xff0c; 你好。我是茶桁。 课程回顾 上节课&#xff0c;咱们讲了一个股票的指标&#xff1a;MACD。在趋势行情里面它应该还是有效的指标。它比较忌讳动荡行情&#xff0c;比如说它一会上…

###C语言程序设计-----C语言学习(5)#

前言&#xff1a;感谢您的关注哦&#xff0c;我会持续更新编程相关知识&#xff0c;愿您在这里有所收获。如果有任何问题&#xff0c;欢迎沟通交流&#xff01;期待与您在学习编程的道路上共同进步&#xff01; 一. 主干知识的学习 1.switch语句 switch语句可以处理多分支选…

ubuntu 22 安装 node,npm,vue

1:安装 nodejs sudo apt update curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt update && sudo apt install -y nodejs node -v 2:安装npm sudo npm install n -g npm -v 3:安装vite npm install vite -g 4:运行vue 把项目拷贝到…

公考之判断推理(一、图形推理)

一、前言 判断推理这一题型主要具体分为四种题型&#xff1a; 1.图形推理 2.类比推理 3.定义判断 4.逻辑判断每种题型做题方法又不一样。 才本文采用总分的形式结构。 每一小标题的下面紧接着就是总结。二、图形推理常见的命题形式 图形推理常见的命题形式&#xff1a; 1.…

鸿蒙ArkUI 宫格+列表+HttpAPI实现

鸿蒙ArkUI学习实现一个轮播图、一个九宫格、一个图文列表。然后请求第三方HTTPAPI加载数据&#xff0c;使用了axios鸿蒙扩展库来实现第三方API数据加载并动态显示数据。 import {navigateTo } from ../common/Pageimport axios, {AxiosResponse } from ohos/axiosinterface IDa…

ASP.NET Core基础之用扩展方法封装服务配置

阅读本文你的收获 了解C#中的扩展方法机制学会在ASP.NET Core 中&#xff0c;用扩展方法封装服务配置&#xff0c;使得代码更加简洁 一、什么是扩展方法 扩展方法使能够向现有类型添加方法&#xff0c;而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法…

从 React 到 Qwik:开启高效前端开发的新篇章

1. Qwik Qwik 是一个为构建高性能的 Web 应用程序而设计的前端 JavaScript 框架,它专注于提供即时启动性能,即使是在移动设备上。Qwik 的关键特性是它采用了称为“恢复性”的技术,该技术消除了传统前端框架中常见的 hydration 过程。 恢复性是一种序列化和恢复应用程序状态…

HbuilderX报错“Error: Fail to open IDE“,以及运行之后没有打开微信开发者,或者运行没有反应的解决办法

开始 问题:HbuilderX启动时,打开微信开发者工具报错"Error: Fail to open IDE",以及运行之后没有打开微信开发者,或者运行没有反应的解决办法! 解决办法: 按照步骤一步一步完成分析,除非代码报错,否则都是可以启动的 第一步:检查HbuildX是否登录账号 第二步:检查微信…
最新文章