函数与数组

目录

函数

函数的格式

函数返回值

函数传参

实验

阶乘

递归函数

函数库

数组

shell中创建数组方法

方法一

方法二

方法三

命令

追加数组元素

数组的应用

冒泡排序

实验


函数

把命令序列按照格式写在一起,命令序列可以重复使用

使用函数可以避免代码的重复
函数可以将大的工程分割成若干小的模块,可以提高代码的可读性。

函数的格式

格式一
function 函数名 {
命令序列
}
函数名 #调用函数

格式二
函数名 () {
命令序列
}
函数名 #调用函数

函数返回值

在 Shell 脚本中,return 语句用于指定函数的退出状态码(返回码)

1.表示退出函数并返回一个退出值,用$?可以显示这个值,退出值范围为0-255,超过255时会除以256取余
2.在shell脚本中,return的返回值默认就是0或者非0的返回码
return作用在函数内部,在shell中return一般就是判断涵数的执行情况

exit作用于整个脚本,立即终止,没有返回码,脚本立即停止运行。
exit 0 程序正常退出 非0程序是异常退出

函数传参

在shell中,调用函数可以传递参数,用位置变量来传参,在函数内部可以定义位置变量。:·

函数变量的作用范围
函数在shell中仅在当前的shell环境中有效
在函数中定义的变量默认为全局变量

实验

阶乘

计算输入值的阶乘

jiecheng () {
 if [ $1 -eq 1 ]
  then
   echo "1"
  else
     local temp=$(($1-1))
     local res=$(jiecheng $temp)
     echo "$(($1*$res))"
fi
}
read -p "请输入阶乘数" n
res=`jiecheng $n`
echo $res 

递归函数

函数调用自己本身的函数

递归查看目录与文件

dayin () {
for f in $(ls $1)
 do
  if [ -d "$1/$f" ]
    then
     echo "$f"
     dayin "$1/$f"
    else
      echo "$f"
fi
done

}
read -p "输入目录绝对路径" n
file=`dayin $n`
echo "$file"

函数库

函数库中只包含函数的定义,脚本中包含调用函数的方法也可以有执行代码。

计算器使用函数库

函数库

jiafa () {
  res=$(($1+$2))
   echo $res
}


jianfa () {
  res=$(($1-$2))
  echo $res
}

chengfa () {
  res=$(($1*$2))
  echo $res
}

chufa () {
  if [ $2 -ne 0 ]
  then
  res=$(($1/$2))
  echo $res
  else
  echo"被除数不能为零"
fi
}

调用程序

. /opt/test

read -p "输入第一个数" num1
read -p "输入第二个数" num2
jia=`jiafa $num1 $num2`
jian=`jianfa $num1 $num2`
cheng=`jdhengfa $num1 $num2`
chu=`chufa $num1 $num2`

echo "$jia"
echo "$jian"
echo "$cheng"
echo "$chu"

数组

数组 数字组成的组,组里可以是int类型,string,字符串等,数组中的数据类型可以有用户自定义。既可以是同一种也可以是不同的数据类型组成的元素集合
数组的最大作用是可以一次性定义多个变量

shell中创建数组方法

方法一

shuzu=(aaa 123 www 555)
定义数组名称
() 定义数组的元素,多个元素由空格隔开

方法二

shuzu=([0]=aaa [1]=123 [2]=www)
[0][1][2] 表示数组的下标索引,数组中索引下标从0开始

方法三

shuzu [0]=aaa
shuzu [1]=123
shuzu [2]=www

命令

获取

获取对应元素下标的值
echo ${shuzu[1]}
获取数组包含所有元素
echo ${shuzu[*]}
echo ${shuzu[@]}

查看数组中含有元素数量
echo ${#shuzu[*]}

数组的遍历

sz1=(test test1 test2 test3 test4)
for user in ${sz1[*]}
  do
   useradd $user
  read -p "输入${user}的密码" mima
  echo "$mima" | passwd --stdin "$user"
done

数组的切片

sz=(test test1 test2 test3 test4)
echo ${sz[*]:0:2}
索引下标后面的步长,是从当前的索引下标的位置,包含自己的位置,往后走几位,这里指的都是索引位詈,不是对应的元素值

数组的替换

替换数组当中的元素

echo ${sz[*]/test2/tihuan} 临时替换,原数组的值不会修改
sz=(sz[*]/test2/tihuan) 永久替换,通过重新赋值来实现

删除整个数组
unset sz

删除数组中指定元素
unset sz[3]
通过索引下标的位置,删除数组中指定的元素

追加数组元素

方法一
sz[5]=test5
索引位置为空,可以是追加,如果索引位置有值就是替换
如果要追加元素,一般是按照索引下标的顺序来进行添加。

方法二
sz[${#sz[*]}]=test6
用的最多的方式

方式三
sz+=(test7 test8)
最简单的方式

数组的应用

数组与函数之间的应用
数组作为参数传给函数

seq 自动生成数字排序
seq 1 10       1-10
seq 1 2 10    1 3 5 7 9
seq 10 1       10-1
seq 10 -2 1   10 8 6 4 2

冒泡排序

面试会问
在数组当中从小到大或从大到小进行排序,就是把一个大小顺序混乱的数组排序。

冒泡排序思路

test=(20 10 60 40 50 30)
从小到大
两个相邻的数比大小,大的向右,小的向左

冒泡排序需要双循环
外循环确定次数
内循环比较大小,换位置
实现和循环次数的轮次而减少

实验

从大到小排列占用的内存大小

df -h
abc=(`df -h | awk 'NR>1 {print $5}' | tr -d "%"`)
echo "原占用的排列顺序为:${abc[*]}"
length=${#abc[*]}
for ((i=1;i<$length;i++))
do
  for ((k=0;k<$[$length - $i];k++))
   do
    first=${abc[$k]}
     j=$(($k+1))
     second=$((abc[$j]))
    if [[ $first -lt $second ]]
    then
      temp=$first
        abc[$k]=$second
        abc[$j]=$temp
     fi
   done
done
echo "排序后的占用顺序为:${abc[*]}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值