当前位置: 首页 > news >正文

Shell编程之函数和数组

目录

一.函数

1.1函数的定义

1.2函数使用的注意点

1.3函数相关的操作 

1.3.1定义参数

1.3.2查看函数 

1.3.3调用函数 

1.3.4函数的传参

1.3.5函数的返回值

1.3.6删除函数

1.3.7函数的作用范围 

1.3.8函数文件

1.4函数练习

二.数组 

2.1数组的定义

2.2数组的作用

2.3数组的定义

2.4查看数组

2.5数组的分类

2.5.1普通数组

2.5.2关联数组 

2.6数组相关的操作

2.6.1查看数组相关的信息

2.6.2遍历数组

2.6.2删除数组 

2.6.3替换数组

2.7 数组练习----点名脚本


一.函数

1.1函数的定义

在Shell脚本中,函数是一组可以重复使用的命令集合,它们可以接收参数并返回结果。

1.2函数使用的注意点

  1. 默认情况下,函数内定义的变量是全局的,必须使用local关键字声明局部变量。

  2. 函数必须在调用前定义。

  3. 函数名可能与命令或别名冲突

  4. 函数内部错误不会自动终止脚本执行

  5. 需要手动处理错误状态

  6. Shell函数参数传递是位置参数,没有命名参数

 补充:什么是位置参数

位置参数的定义:位置参数是指通过参数在参数列表中的位置顺序来识别的参数,而不是通过参数名称。

# 定义函数
example_func() {echo "第一个参数: $1"echo "第二个参数: $2"
}# 调用函数
example_func "value1" "value2"

在这个例子中:

  • $1 对应第一个传递的值 "value1"

  • $2 对应第二个传递的值 "value2"

  • 参数完全由位置决定,与名称无关

1.3函数相关的操作 

1.3.1定义参数

方式一:
function_name() {函数体}方式二:
function function_name {函数体}方式三:
function function_name () {函数体}以上三种方式第一种最常用

1.3.2查看函数 

declare -F
#查看所有已定义的函数的函数名declare -F function_name
#查看指定函数的函数名declare -f
#查看所有已定义的函数的内容declare -f function_name
#查看指定函数的内容

1.3.3调用函数 

再次强调函数在调用请,必须先定义

#先定义函数
function_name() {
# 函数体
}#调用函数
function_name

1.3.4函数的传参

Shell函数通过位置参数接收传递的

​
# 定义函数
greet() {echo "Hello, $1! You are $2 years old."
}# 调用函数(参数按位置传递)
greet "dhf" 24输出
Hello, dhf! You are 24 years old.

1.3.5函数的返回值

函数可以通过return语句设置返回值,脚本中可以用$?变量表示该值。

使用 return 语句返回只能是 0-255 的整数,0 表示成功,非0表示失败;通过 $? 获取返回值

返回值的作用:

  1. 对函数执行的结果进行判断和处理:函数可以返回不同的值来表示不同的执行状态或错误情况。

  2. 传递函数执行的结果给其他部分:函数的返回值可以被赋值给变量,能将函数的计算结果传递给其他命令或者再次使用。

  3. 作为脚本的退出状态码:根据不同的返回值来设置不同的退出状态码。

 1.3.6删除函数

unset function_name 
#从当前的 Shell 环境中删除指定的函数

1.3.7函数的作用范围 

默认情况下,函数内定义的变量是全局的,必须使用local关键字声明局部变量。

1.3.8函数文件

将函数代码写入一个脚本文件,在需要的时候调用该脚本文件,相当于直接调用函数。
Shell脚本中使用函数文件时,需要写上
函数文件的绝对路径

1.4函数练习

 

[ [ == ] ] #开启通配符
[ [ =~ ] ] #开启正则表达式 #!/bin/bash # 定义系统检测函数
os () {if grep -qi 'centos' /etc/os-release; thenecho "centos"elif grep -qi 'ubuntu' /etc/os-release; thenecho "ubuntu"elseecho "不支持此系统"fi
}# 调用函数并获取结果
system_type=$(os)# 根据系统类型执行安装
if [ "$system_type" = "centos" ]; thenecho "→ 检测到CentOS系统"echo "→ 正在安装httpd..."yum install -y httpdecho "✔ httpd安装完成"elif [ "$system_type" = "ubuntu" ]; thenecho "→ 检测到Ubuntu系统"echo "→ 正在安装apache2..."apt install apache2 -yecho "✔ apache2安装完成"elseecho "× 错误:$system_type"echo "× 安装失败"
fi

二.数组 

2.1数组的定义

数组是在连续内存空间中存储的一组相同类型的数据元素,每个元素可以通过索引(下标)来访问。

2.2数组的作用

  1. 数据存储:高效存储大量同类型数据

  2. 快速访问:通过索引可以在O(1)时间复杂度内访问任意元素

  3. 算法基础:是许多高级数据结构和算法的基础

  4. 批量处理:便于对一组数据进行统一操作

2.3数组的定义

方式一: 
数组名=( value0 value1 value2 value3 ......)方式二:
数组名=([0]=value [1]=value1 [2]=value2 ....)
#[0] [1] [2] 为下标值方式三:
列表名="value0 value1 value2 value3 ...... "
数组名=($列表名)方式四:
数组名[0]="value1"数组名[1]="value2"数组名[2]="value3"#一次只赋一个值方式五:
read -a 数组名
要输入的内容 #数组内容 

2.4查看数组

假设要查看的数组是array1. 查看整个数组
# 查看所有元素(保留引号和空格)
echo "数组所有元素: ${array[@]}"# 查看所有元素(展开为单独的词)
echo "数组展开元素: ${array[*]}"# 使用declare命令查看数组定义
declare -p array2. 查看数组元素
# 查看特定索引的元素
echo "第一个元素: ${array[0]}"
echo "最后一个元素: ${array[-1]}"# 查看索引范围(切片)
echo "第2到第4个元素: ${array[@]:1:3}"

后面还有关联数组的查看方法

2.5数组的分类

数组可以分为普通数组和关联数组 

2.5.1普通数组

  1. 普通数组使用 数字索引(从 0 开始)来存储和访问元素。

  2. 声明时使用 declare 或 declare -a 命令。

  3. 元素之间的顺序是固定的

1.定义方式
# 方式1:直接赋值
arr=("wind" "fire" "water")# 方式2:逐个赋值
arr[0]="wind"
arr[1]="fire"
arr[2]="water"2.访问方式
echo ${arr[0]}    # 输出 "wind"
echo ${arr[1]}    # 输出 "fire"
echo ${arr[-1]}   # 输出 "water"
​​

2.5.2关联数组 

  1. 使用任意字符串作为键来访问和存储元素。

  2. 声明时使用 declare -A 命令。

  3. 元素之间的顺序是不固定的,通过键进行访问。

1.定义方式:
# 必须先声明为关联数组
declare -A assoc_arr# 赋值方式
assoc_arr=(["name"]="Alice"["age"]=25["city"]="New York"
)# 或者逐个赋值
assoc_arr["name"]="Bob"
assoc_arr["age"]=302.访问方式:
echo ${assoc_arr["name"]}  # 输出 "Alice"
echo ${assoc_arr["age"]}   # 输出 25​

2.6数组相关的操作

2.6.1查看数组相关的信息

1.显示下标个数
echo ${#a[*]} 
或者
echo ${#a[@]}        2.获取数组列表中所有元素的值
echo ${a[*]}
或者
echo ${a[@]}3.读取数组下标/索引
echo ${!a[*]}

2.6.2遍历数组

按顺序访问数组中的每个元素。 

#举个例子##!/bin/bash
a=(1 2 3 4 5)
for i in ${a[@]}
do
echo $i
done

2.6.2删除数组 

1.删除整个数组
unset 数组名
示例:
fruits=("apple" "banana" "orange")
declare -A person=(["name"]="Alice" ["age"]=25)unset fruits      # 删除普通数组
unset person      # 删除关联数组2.删除数组中的特定元素
对于普通数组:unset array_name[index]
示例:
fruits=("apple" "banana" "orange")
unset fruits[1]   # 删除索引为1的元素("banana")对于关联数组:unset array_name["key"]
示例:
declare -A person=(["name"]="Alice" ["age"]=25 ["city"]="NY")
unset person["age"]  # 删除"age"键值3.清空数组
array_name=()
示例:
colors=("red" "green" "blue")
colors=()         # 清空数组

 2.6.3替换数组

方式一​
普通数组:
array_name[index]=新值
示例:
fruits=("apple" "banana" "orange")
fruits[1]="pear"  # 将索引1的元素从"banana"改为"pear"关联数组:
array_name["key"]=新值
示例:
declare -A person=(["name"]="Alice" ["age"]=25)
person["age"]=26  # 修改age的值方式二
​a=(1 2 3 4 5)echo ${a[@]/4/66} 	#${数组名[@或*]/查找字符/替换字符}
echo ${a[@]}			#并不会替换数组原有内容a=(${a[@]/4/66})	#要实现改变原有数组,可通过重新赋值实现
echo ${a[@]}

2.7 数组练习----点名脚本

#点名脚本#!/bin/bash
a=( aa bb cc dd ee ff )
x=${#a[@]}
j=`echo $[RANDOM%$x]`
n=$[ j+1 ]
echo "学号是 $n"
echo ${a[$j]}

相关文章:

  • Vue3:component(组件:uniapp版本)
  • gem5教程第五章 了解gem5默认配置脚本
  • Vue3父子组件数据同步方法
  • AtCoder Beginner Contest 402题解
  • 云原生--CNCF-3-核心工具介绍(容器和编排、服务网格和通信、监控和日志、运行时和资源管理,安全和存储、CI/CD等)
  • 华为开发岗暑期实习笔试(2025年4月16日)
  • 配置kafka与spark连接
  • Unity导入GLB模型 需要用到这个插件
  • 基于CBOW模型的神经网络词向量转换原理与实践
  • 音视频小白系统入门课-4
  • leetcode-位运算
  • 搭建TypeScript单元测试环境
  • JWT的token泄露要如何应对
  • win10 快速搭建 lnmp+swoole 环境 ,部署laravel6 与 swoole框架laravel-s项目3
  • QT 打包安装程序【windeployqt.exe】报错c000007d原因:Conda巨坑
  • CIFAR-10图像分类学习笔记(一)
  • 同样的接口用postman/apifox能跑通,用jmeter跑就报错500
  • HarmonyOS Grid 网格列表可长按 item 拖动移动位置
  • Shopee五道质检系统重构东南亚跨境格局,2025年电商游戏规则悄然改写
  • QT容器类控件及其属性
  • 国防部:希望美方不要有“受迫害妄想症”,总拿别人当借口
  • 复旦大学校长金力:将配套出台多项政策推动科技成果转化
  • 印控克什米尔发生恐袭事件,外交部:中方反对一切形式的恐怖主义
  • 网培机构围猎中老年人:低价引流卖高价课、“名师”无资质,舆论呼吁加强监管
  • 耐克领跑女性运动市场:持续加码、创新,更多新增长点有望涌现
  • 江苏一季度实现地区生产总值3.3万亿元,同比增长5.9%