shell脚本——函数与数组

发布时间 2023-11-23 19:55:33作者: 打开方式不对

函数

函数和别名很像

有些脚本会被反复使用

alias 脚本比较复杂

函数 脚本的别名

使用函数可以避免代码重复,增加可读性,简化脚本

定义

函数名 () {

脚本

}

function 函数名 (){

脚本

}

先定义在调用

#!/bin/bash
os () {
if grep -iq centos /etc/os-release
then
echo "该系统是centos"
elif grep -iq ubuntu /etc/os-release
then
echo "该系统是ubuntu"
else
echo "该系统既不是centos,也不是ubuntu"
fi
}

os

 #用“.”(source)不用bash

函数的返回值

加 local 关键字 可以让 变量 只在函数中生效,不会影响外部环境

local:只在函数内部生效,外部不生效

return:自定义返回值(0~255)

如果使用函数 那么 $?使用就会受限

我们可以使用return自定义$?的返回值,来判断 函数中的命令是否成功

#!/bin/bash
user () {

if [ $USER = root ]
then
echo "这是管理员用户"
else
echo "这不是管理员用户"
return 1
fi

}
user

函数的传递参数

需要注意

脚本的$1 $2

函数的$1 $2

是没有关系的

函数的$1$2是指跟在函数后面的值

 

 拓展:

阶乘:

#!/bin/bash
fact () {
   if [ $1 -eq 1 ]
   then
   echo 1
   else
   echo $[$1*`fact $[$1-1]`]
   fi
}
fact $1

 #求5的阶乘结果 120

4的阶乘结果 *5
3的阶乘结果 *4
2的阶乘结果 *3
1的阶乘结果 *2

1的阶乘结果是 1

#一个正整数的阶乘,是所有小于及等于该数的正整数的积,并且0和1的阶乘为1,自然数n的阶乘写作n!

n!=1✖2✖3✖...✖n

阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n

 

垃圾回收站:

#!/bin/bash
DIR=`mktemp -d /tmp/trash-$(date +%F_%H-%M-%S)XXXXXX`
mv $* $DIR
echo $* is move to $DIR
alias rm=/data/ljz.sh

 #将目录中不需要的文件用这个脚本删除,会在/tmp/这个目录下创建一个删除当成的日期、时间结尾为6个随机字符的文件夹,并收入

 数组

数据的集合称为数组

普通数组:下标是数子

关联数组:下标是有含义的字符串

变量:存储单个元素的内存空间  一 一对应

数组:存储多个元素的连续的内存空间,相当于多个变量的数据集合 一对多

数组名和索引下标

  • 索引的编号从0开始,属于数值索引
  • 索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引
  • bash的数组支持稀疏格式(索引可以不连续)

在使用数组前,先声明

declare -a 普通数组 (不需要手动 声明,系统帮你声明)

关联数组一定要手动声明

declare -A 数组名

定义数组的方法

1、数组名=(数组值 ,中间用空格隔开)

2、数组名[下标1]=值1

数组名[下标2]=值2

.......

数组名[下标n]=值n

例子
a=(10 20 30 40 50)
调用数组(单个调用)
echo ${a[0]}
10
echo ${a[1]}
20
echo ${a[2]}
30
...
全部调用
echo ${a[@]}
10 20 30 40 50
echo ${a[*]}
10 20 30 40 50
显示数组的值的个数
echo ${#a[@]}
显示数组的下标的个数
echo ${!a[@]}
删除数组
unset 数组名

关联数组

例子:
declare  -A f
f[name]=cjw
f[home]=js
f[people]=4

 

数组切片

a= (10 20 30 40 50)

echo ${a[@]:2:2} 他的结果是30 40

跳过前两个,再往后取两个值

如何遍历数组

a=(zs lisi ww jj)
for i in ${a[@]}
do
echo $i
done



r=`echo $[RANDOM%38]`
echo ${a[$r]}

最大值和最小值

#!/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

# 随机生成10个数,从中选出最大值和最小值

数组排序算法:

冒泡排序:

#!/bin/bash
#生成一个随机数组
for i in {0..9}
do
  a[$i]=$RANDOM
done
echo "原始数组为: ${a[@]}"
l=${#a[@]}
#定义变量l为数组a的长度10
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[@]}"

冒泡 是通过数字比较 将大的数往后排 小的数往前面排
5个数字 5-1=4 需要比较4轮 才能知道每一个数字的具体位置
    a=(70 40 30 60 50)
轮次        总个数      需要比较的数        比几次       找到的数
第1轮    5      5个数      比4次    找到最大数
第2轮    5      4个数      比3次    找到第二大数
第3轮    5      3个数      比2次    找到第三大的数
第4轮    5      2个数      比1次    找到第四大的数