目录
一、函数
1.1 定义
基本格式:
格式一:
function 函数名 {
命令序列
}
格式二:
函数名() {
命令序列
}
格式三:
function 函数名() {
命令序列
}
注意事项
- 直接写 函数中调用函数 直接写函数名
- 同名函数 后一个生效
- 调用函数一定要先定义
- 每个函数是独立
1.2 调用、查看与删除
调用方式:
func1 () { #在当前环境中,将a=10
a=10
}
func1 #调用函数
若在本地bash环境中调用函数,则会改变本地的shell环境
查看方式:
declare -F #查看函数列表,只能看到函数名
declare -f #查看函数列表,可以看到函数具体内容
declare -f 函数名 #查看特定函数的内容
declare -F 函数名 #查看特定函数的函数名
删除方式:
unset 函数名
1.3 返回值
return表示退出函数并返回一个退出值,脚本中可以用$?变量表示该值
使用原则:
- 函数一结束就去返回值,应为$?变量只返回执行的最后一条命令的退出返回码
- 退出码必须是0-255,超出的值将为除以256取余
#!/bin/bash
test() {
read -p "请输入一个数字:" num
return $[$num*2] #修改返回值为num*2
}
test1 #调用函数
echo $? #查看返回值
1.4 传参数
函数变量的作用范围:
函数在shell脚本中仅在当前的shell环境中有效
shell脚本中函数的变量默认全局有效
将变量限定在函数内部使用local命令
#!/bin/bash
global=10 #全局变量
test (){
local global=20 #local表示将当前变量值仅限定在函数内部
echo $global
}
test #调用函数 global=20
echo $global #global=10
1.5 阶乘的实现
#!/bin/bash
func1 (){
if [ $1 -eq 1 -o $1 -eq 0 ] #1和0的阶乘都是1
then echo 1
else
local tmp=$[ $1-1 ] #定义输入数的前一个数
local result=$(func1 $tmp) #得到前一个数的阶乘
echo $[ $1*$result ] #计算阶乘
fi
}
read -p "请输入:" n
result=$(func1 n) #放入函数中计算阶乘
echo $result #得到结果
二、数组
1.1 定义
数组分为:
- 普通数组 索引编号从0开始
- 关联数组 索引为自定义
变量:存储单个元素的内存空间
数组:存储多个元素的连续的内存空间,相当于多个变量的集合
索引的编号从0开始,属于数值索引
索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash 4.0版本之后开始支持
bash的数组支持稀疏格式(索引不连续)
普通数组可以不事先声明,直接定义
格式一:
数组名 = (value1 value2 value3 ...)
格式二:
数组名 = ([0]=value [1]=value [2]=value ...)
格式三:
列表名 = "value1 value2 value3 ..."
数组名 = ($列表名)
格式四:
数组名[0]="value1"
数组名[1]="value2"
数组名[2]="value3"
关联数组必须事先声明,再使用
格式:
declare -A 数组名
数组名[索引名1]=value1
数组名[索引名2]=value2
数组名[索引名3]=value3
...
...
举例:
declare -A family
family[population]=8
family[first_name]=smith
family[car]=bwm
1.2 获取数组
a=(1 2 3 4 5) #定义数组
echo ${a[*]} #获取a数组数据列表
echo ${a[@]} #获取a数组数据列表
echo ${#a[*]} #获取a数组索引个数
echo ${#a[@]} #获取a数组索引个数
echo ${!a[@]} #获取a数组的所有索引
echo ${!a[*]} #获取a数组的所有索引
【数组的遍历】
#!/bin/bash
a=(1 2 3)
for i in ${a[*]}
do
echo $i
done
1.3 数组切片
a=(1 2 3 4 5)
echo ${a[@]:2:3} #跳过2个元素,并且取出3个元素,结果为3 4 5
echo ${a[*]/3/66 #显示数组a的数据列表,且第三个数显示为66
unset a #删除数组a
unset a[2] #删除数组a中索引为2的元素
1.4 求数组中的最大值
#!/bin/bash
read -p "请定义一个数组的内容:" n
arr=($n)
max=arr[0]
for ((i=0;i<=${#arr[*]}-1;i++))
do
if [[ $max -lt ${arr[$i+1]} ]]
then
max=${arr[$i+1]}
else
continue
fi
done
echo "最大值为:$max"