Shell编程函数与数组

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

目录

函数的定义

如何使用函数

函数变量的作用范围

函数的返回值

两个数字求和

函数的传递参数

递归脚本

数组

数组的定义

 读取数组实验

数组的使用

求数组最大值

冒泡脚本实验


函数

函数的定义

函数名 () {}

  • 将命令序列按格式写在一起

  • 可方便重复使用命令序列

[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!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值