shell(函数和数组)

目录

一、函数

1.函数的由来

2.函数的作用

3.函数的使用方法

4.函数的定义

5.查看函数

6.删除函数

7.函数返回值

8.函数的传参数

9.函数递归

二、数组

1.数组的相关介绍

2.声明数组

3.定义数组的格式

4.冒泡排序

总结:本章主要介绍了函数和数组相关知识


一、函数

1.函数的由来

在编写脚本时,有些脚本可以反复使用,可以调用函数来解决,脚本定义成函数类似于别名

2.函数的作用

函数的作用:避免脚本重复性,增加可读性,方便使用

3.函数的使用方法

先定义函数再引用函数

1.直接写 函数中调用函数 直接写函数名

2.同名函数 后一个生效

3.调用函数一定要先定义

4.每个函数是独立

4.函数的定义

基本格式

1.

function 函数名 {

命令序列

}

2.

函数名 () {

命令序列

}

3.

function 函数名 {

命令序列

}

例子:

shell(函数和数组)_第1张图片

5.查看函数

declare -F   查看函数列表

declare -f    查看函数的具体定义

shell(函数和数组)_第2张图片

shell(函数和数组)_第3张图片

6.删除函数

unset 函数名

shell(函数和数组)_第4张图片

7.函数返回值

return(自定义返回值)范围(0-255)超出时除以256取余

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

使用原则:

  1. 函数一结束就去返回值,应为$?变量只返回执行的最后一条命令的退出返回码

  2. 退出码必须是0-255,超出的值将为除以256取余

[root@localhost opt]# vim f.sh
[root@localhost opt]# bash f.sh
输入数字:8
16
#!/bin/bash
fc1 (){
read -p "输入数字:" s
return $[$s*2]
}
fc1
echo $?

shell(函数和数组)_第5张图片

shell(函数和数组)_第6张图片

8.函数的传参数

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

脚本中的$1,$2和函数的$1,$2是没有关系的

[root@localhost data]# vim r.sh
[root@localhost data]# bash r.sh 2 3
2
3

#!/bin/bash
sum1 (){
echo $1
echo $2
}
sum1 $1 $2

shell(函数和数组)_第7张图片

函数变量的作用范围

local命令:只在内部有效对外部无效(局部变量)只对函数有效

name命令:普通变量

export命令:让子shell继承变量

如果加local关键字可以让变量只在函数中生效,不会影响外界函数的返回值

9.函数递归

函数调用自己本身的函数(阶乘)

例:

5!=5*4*3*2*1=120

4!=4*3*2*1=24

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

vim jc.sh
[root@localhost data]# bash jc.sh 3
6
[root@localhost data]# bash jc.sh 4
24

二、数组

1.数组的相关介绍

数组分为普通数组和关联数组

普通数组下标为数字

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

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

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

数组名和索引

索引的编号从0开始,属于数值索引

索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引

bash的数组支持稀疏格式(索引不连续)

2.声明数组

使用数组需要先声明数组

普通数组:                          declare -a [数组名]

普通数组不需要手动声明,系统自动帮你声明

关联数组:                          declare -A [数组名]

关联数组一定要声明

3.定义数组的格式

定义数组格式:

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

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

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

4.数组名=($列表名)

数组名[0]="value1"

数组名[1]="value2"

数组名[2]="value3"

数组的包括数据类型

数值型

字符型

混合型数值加字符

使用" "或' '定义单引号或双引号括起来

[root@localhost ~]# a=(10 20 30 40 50)
[root@localhost ~]# declare -a
declare -a BASH_ARGC='()'
declare -a BASH_ARGV='()'
declare -a BASH_LINENO='()'
declare -a BASH_SOURCE='()'
declare -ar BASH_VERSINFO='([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")'
declare -a DIRSTACK='()'
declare -a FUNCNAME='()'
declare -a GROUPS='()'
declare -a PIPESTATUS='([0]="0")'
declare -a a='([0]="10" [1]="20" [2]="30" [3]="40" [4]="50")'
[root@localhost ~]# echo ${!a[*]}
0 1 2 3 4
[root@localhost ~]# echo ${a[0]}
10
[root@localhost ~]# echo ${a[@]}
10 20 30 40 50
[root@localhost ~]# echo ${#a[@]}
5
[root@localhost ~]# echo ${!a[@]}
0 1 2 3 4
[root@localhost ~]# 

a=(10 20 30 40 50) 定义数组

declare -a  查看数组

 echo ${!a[*]}  查看下标

echo ${a[0]}  查看数组中个体

echo ${!a[*]}  查看所有下标

echo ${a[@]}  查看数组中的所有个体

echo ${#a[@]}   查看数组的长度(个数)

echo ${!a[@]}   查看所有下标

*和@同义

数组分隔

echo ${a[@]:0:5}

[root@localhost ~]# echo ${a[@]:0:5}
10 20 30 40 50
[root@localhost ~]# echo ${a[@]:2:5}
30 40 50
[root@localhost ~]# echo ${a[@]:2:2}
30 40
[root@localhost ~]# echo ${a[@]:2:3}
30 40 50
[root@localhost ~]# echo ${a[@]}
10 20 30 40 50
[root@localhost ~]# 

echo ${a[@]:0:5}  代表跳过前0个提取后5个

echo ${a[@]:2:2} 代表跳过前2个提取后2个

echo ${a[@]}  代表数组所有个体

[root@localhost ~]# echo ${a[@]}
10 20 30 40 50
[root@localhost ~]# echo ${a[1]}
20
[root@localhost ~]# a[1]=9
[root@localhost ~]# echo ${a[1]}
9
[root@localhost ~]# echo ${a[@]}
10 9 30 40 50
[root@localhost ~]# 

a[1]=9 数组替换把原来的20换成了9

4.冒泡排序

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

#!/bin/bash
a=(10 50 89 46 38)
for ((i=1;i<5;i++))
do
  for ((j=0;j<5-$i;j++))
  do
  f=${a[$j]}
  m=$[$j+1]
  s=${a[$m]}
  if [ $f -gt $s ]
  then
  q=$f
  a[$j]=$s
  a[$m]=$q
  fi
  done
done
echo "排序后的数组为${a[@]}"

[root@localhost data]# vim mpd.sh
[root@localhost data]# bash mpd.sh
排序后的数组为10 38 46 50 89
[root@localhost data]# 

总结:本章主要介绍了函数和数组相关知识

你可能感兴趣的:(linux,运维)