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函数使用的注意点
-
默认情况下,函数内定义的变量是全局的,必须使用
local
关键字声明局部变量。 -
函数必须在调用前定义。
-
函数名可能与命令或别名冲突
-
函数内部错误不会自动终止脚本执行
-
需要手动处理错误状态
-
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.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数组的作用
-
数据存储:高效存储大量同类型数据
-
快速访问:通过索引可以在O(1)时间复杂度内访问任意元素
-
算法基础:是许多高级数据结构和算法的基础
-
批量处理:便于对一组数据进行统一操作
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普通数组
-
普通数组使用 数字索引(从 0 开始)来存储和访问元素。
-
声明时使用
declare
或declare -a
命令。 -
元素之间的顺序是固定的
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关联数组
-
使用任意字符串作为键来访问和存储元素。
-
声明时使用
declare -A
命令。 -
元素之间的顺序是不固定的,通过键进行访问。
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]}