shell脚本中的函数与数组

121 阅读2分钟

1.函数

1.1函数的作用

在编写脚本时,有些脚本可以反复使用,可以调用函数来解决

语句块定义成函数约等于别名

函数使用方法:

  1. 定义函数
  2. 再引用函数

1.2函数的定义

【1】 function 函数名 { 命令序列 ;}

image.png 【2】 函数名() { 命令序列 ;}

image.png 【3】 unction func_name () {

...函数体...

}

注意事项

  1. 直接写 函数中调用函数 直接写函数名
  2. 同名函数 后一个生效
  3. 调用函数一定要先定义
  4. 只要先定义了调用的 其他函数定义顺序无关
  5. 函数是将脚本定义成一个命令,调用命令时记得使用 命令,调用结果

6.3 查看函数

delcare -F :查看函数的列表

image.png

delcare -f :查看函数的具体命令

image.png

删除函数:

unset 函数名

6.4 函数的返回值

return表示退出函数并返回一个退出值,脚本中可以用$?变量表示该值

使用原则:

  1. 函数一结束就去返回值,应为$?变量只返回执行的最后一条命令的退出返回码
  2. 退出码必须是0-255,超出的值将为除以256取余
#!/bin/bash
test1 () {
        read -p "请输入一个数字:" num
        echo $[$num*2]


}

result=`test1`
echo $result

image.png

6.5函数的变量范围

函数在shell脚本中仅在当前的shell环境中有效

shell脚本中函数的变量默认全局有效

将变量限定在函数内部使用local命令

[root@localhost opt]# cat demo8.sh 
#!/bin/bash
myfun(){
i=8
echo $i

}
myfun
i=9
echo $i

[root@localhost opt]# ./demo8.sh 
8
9

image.png

6.6 函数的递归

函数调用自己本身的函数

阶乘:

函数调用自己
#!/bin/bash
#求 5的阶乘 需要 5-1=4  (1*2*3*4)*5
fact() {
if [ $1 -eq 0 -o $1 -eq 1 ] 
then
echo 1
else
echo $[$1*$(fact $[$1-1])]
 fi
}
fact $1

6.7 使用函数文件

我们可以新建一个专门存放函数的文件

[root@localhost data]#vim functions 

ostype (){
   if  grep -i -q "linux 6" /etc/os-release
   then
   echo "centos6"
   elif grep -i -q "linux 7" /etc/os-release
   then
   echo "centos7"
   elif grep -i -q "linux 8"  /etc/os-release
   then
   echo "centos8"
  else
  echo  "not linux"
  fi
  }

color () {
RED="echo -e \E[31m"
GREEN="echo -e \E[32m"
END="\E[0m"
}
引用时
[root@localhost data]#. functions 
[root@localhost data]#ostype 
centos7

#直接当成命令使用

[root@localhost data]#color
[root@localhost data]#${GREEN}MMM$END
##会变颜色

2.数组

2.1数组的基本格式

  1. 数组名=(value0 value1 value2 value3 ......)

  2. 数组名=([0]=value [1]=value1 [2]=value2 ....)

  3. 列表名="value0 value1 value2 value3 ...... "

    数组名=($列表名)

  4. 数组名[0]="value1"

    数组名[1]="value2"

    数组名[2]="value3"

image.png

数组的包括数据类型

  • 数值型
  • 字符型
  • 混合型数字加字符
输出第一一个数值  注意是从0开始计算
列出所有参数
[root@localhost ~]# echo ${a[*]}   //*代表所有参数
1 2 3 4 5
[root@localhost ~]# echo ${a[@]}   //@同*
1 2 3 4 5
共有多少个位置
[root@localhost ~]# echo ${#a[@]}     //前面加#数组的长度
5
[root@localhost ~]# echo ${#a[*]}    
5

#数组分隔
[root@localhost ~]# a=(1 2 3 4 5)
[root@localhost ky15]#echo ${a[@]:0:5}
1 2 3 4 5
[root@localhost ky15]#a[1]=9
#数组替换
[root@localhost ky15]#echo ${a[1]}
9
[root@localhost ky15]#echo ${a[@]}
1 9 3 4 5
【数组遍历】
#!/bin/bash
a=(1 2 3 4 5)
for i in ${a[@]}
do
echo $i
done

image.png

a=(1 2 3 4 5)

echo ${a[@]/4/66} 	#${数组名[@或*]/查找字符/替换字符}
echo ${a[@]}			#并不会替换数组原有内容

image.png

【取出数组中的最大值和最小值】
最大值
#!/bin/bash
a=( 10 20 50 40 100 )
max=${a[0]}
l=${#a[*]}

for ((i=0;i<$l;i++))
do
if [[ $max -lt ${a[$i+1]} ]]
#判断第一个数是否小于后一个数,如果小于就继续比下去
then
max=${a[$i+1]}
fi
done

echo $max

最小值
read -p "请输入数组" num
a=($num)
min=${a[0]}
for ((i=0;i<${#a[*]}-1;i++))
do
if [[ $min -ge ${a[$i+1]} ]]
then
min=${a[$i+1]}
fi
done
echo "最小值是$min"