目录
函数
函数的定义
函数名 () {}
-
将命令序列按格式写在一起
-
可方便重复使用命令序列
[function] 函数名(){
命令序列
[retunrn x]
} 使用return或exit可以显式地结束函数
如何使用函数
1定义
2.调用
你准备一个只存函数的文件函数 一定要先定义再使用
函数定义完之后并不会自动执行,需要调用才行
好处在于可以写一段功能代码作为函数,有需要就直接调用定义的时候哪怕出现语法错误也没关系,不调用就不会报错
当然我们写函数最终目的还是为了调用,为了实现某个功能块。
函数变量的作用范围
加 local 关键字 可以让 变量 只在函数中生效,不会影响外界环境
函数的返回值
如果 使用 函数 那么 $? 使用就会 受限
我们可以 使用 return 自定义 $? 的 返回值,来判断 函数中的 命令是否成功
return表示退出函数并返回一个退出值,脚本中可以用$? 变量显示该值使用原则
-
函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
-
退出状态码必须是0~255,超出时值将为256取余
[root@zhang hanshu]#vim retun.sh
#!/bin/bash
function test1 {
read -p "请输入数字:" num
return $[num*2]
}
test1
echo $?
[root@zhang hanshu]#sh retun.sh
请输入数字:4
8
[root@zhang hanshu]#sh retun.sh
请输入数字:120
240
[root@zhang hanshu]#sh retun.sh
请输入数字:150
0
两个数字求和
通过sum(){}定义函数 使用read命令交互输入两个数并求和
#!/bin/bash
#sum=0
function A (){
read -p "请输入第一个数字:" B
read -p "请输入第二个数字:" C
sum=`expr $B + $C`
echo "$B + $C = $sum"
return 3
}
#echo $sum
A $B $C
函数的传递参数
需要注意
脚本的 $1 $2
函数的 $1 $2
是没有关系的
递归脚本
#!/bin/bash
fact () {
if [ $l -eq 1 ]
then
echo 1
else
echo $[$1*`fact $[$1-1]`]
fi
}
fact $1
交互式 递归方式计算你输入的数值作为阶乘
#!/bin/bash
#交互式 递归方式计算你输入的数值作为阶乘
#比如我第一次输入5
fun (){
if [ $1 -eq 1 ];then
echo 1
else
#5不等于1执行else的 此时tp=5-1=4;res=4 此时echo为5*4
local tp=$[ $1 - 1 ] #这个是局部
res=$(fun $tp) #相当于直接调用tp本身
echo $[ $1 * $res ] #$1是5
fi
}
read -p "请输入:" num
res=$(fun $num)
echo $res
#执行过程
#fun 5 $1=5 tp=4 res=fun 4 echo 5 * 4() 5*4*3*2*1
#fun 4 $1=4 tp=3 res=fun 3 echo 4 *3(fun) 4*3*2*1
#fun 3 $1=3 tp=2 res=fun 2 echo 3 * 2(fun) 3*2*1
#fun 2 $1=2 tp=1 res=fun 1 echo 2*1(fun) 2*1
#fun 1 $1 echo 1 1
数组
数组的定义
数组中可以存放多个值。Bash Shell 只支持一堆数组(不支持多维数组)
数组元素的下标由 0 开始
Shell 数组用括号来表示,元素用“空格”符合分割开
在 shell 语句中,使用、遍历数组的时候,数组格式要写成 ${arr[@]} 或 ${arr[*]}
数组定义实例
基本格式(一)
数组名=(value0 value1 value2...)
例如
ABC=(11 22 33...)
基本格式(二)
数组名=([0]=value [1]=value [2]=value...)
例如
ABC=([0]=11 [1]=22 [2]=33...)
基本格式(三)
列表名=“value0 value1 value2”
数组名=($列表名)
例如
AAA=“11 22 33...”
ABC=($列表名)
基本格式(四)
数组名[0]=“value”
数组名[1]=“value”
数组名[2]=“value”
例如
AAA[0]=“11”
AAA[1]=“22”
AAA[2]=“33”
读取数组实验
[root@localhost ~]# abc=(1 2 3)
[root@localhost ~]# echo ${abc[*]}
1 2 3
[root@localhost ~]# echo ${#abc[*]}
3
读取数组(第一个数从0开始算)
[root@localhost opt]# echo ${abc[1]}
2
[root@localhost opt]# echo ${abc[0]}
1
[root@localhost opt]# echo ${abc[2]}
3
数组的使用
一定要先声明数组 declare -a 普通数组(不需要手动 声明,系统帮你声明了 ) 关联数组一定要手动声明数组名declare -A 定义数组数组名= ( 1 2 )
求数组最大值
[root@localhost ~]# vim max.sh
#!/bin/bash
for i in {0..9}
do
a[$i]=$RANDOM
[ $i -eq 0 ] && min=${a[0]} && max=${a[0]}
[ ${a[$i]} -gt $max ] && max=${a[$i]}
[ ${a[$i]} -lt $min ] && min=${a[$i]}
done
echo ${a[@]}
echo "最大值是:$max"
echo "最小值是:$min"
:wq!

冒泡脚本实验
【root@localhost ~]# vim mp .sh
#!/bin/bash
for i in {0..9}
do
a[$i]=$RANDOM
done
echo "原始数组为: ${a[@]}"
l=${#a[@]}
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[@]}"
:wq!

本文详细介绍了BashShell编程中函数的定义、调用、作用域、返回值,以及如何处理两个数字求和、数组的定义、遍历和操作(包括求最大值和冒泡排序)。
666

被折叠的 条评论
为什么被折叠?



