Shell脚本函数与数组

214 阅读2分钟

一.函数

1.函数介绍:

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

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

2.函数的使用方法:

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

帮助:help function

3.函数定义:

1.function 函数名 {
          命令序列
  }

image.png

2.函数名() {
       命令序列

}

image.png

 3.unction func_name (){
             命令序列
 }

注意事项

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

4.常用函数

函数名() {
           命令序列

}

实例:

image.png

5. 查看函数列表

declare -F : 查看当前已定义的函数名

declare -f : 查看当前已定义的函数定义

declare -f func_name : 查看指定当前已定义的函数名

declare -F func_name : 查看当前已定义的函数名定义

image.png

image.png

6.删除函数

unset 函数名

7.函数值返回值 return 、echo

获得函数返回值的两种方式:

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

  2. 在函数体中用 echo 输出返回值。并在函数体外使用变量赋值后,可再进一步对函数的返回值进行加工操作。

使用原则:

  • 函数一结束就去返回值,应为$?变量只返回执行的最后一条命令的退出返回码
  • 退出码必须是0-255,超出的值将为除以256取余
image.png

调用

image.png

怎么解决超过 255

#!/bin/bash
test1 () {
    read -p "请输入一个数字:" num
    echo $[$num*2]


}

result=`test1`
echo $result

image.png

调用

image.png

8.函数变量范围

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

Shell脚本中变量默认全局有效

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

image.png image.png
name=zhou;local name=zhou;export name=zhou
  普通变量  函数体变量       子进程尅使用

local name=zhou  必须在函数体中使用



myfun() {
local i
i=8
echo $i
}
i=9
myfun
echo $i

image.png

9.函数递归

func () { echo $i;echo "run fast";let i++;func; }

  • 1.函数调用自己本身的函数
  • 2.必须要有结束函数的语句,防止死循环

实例:

for循环
 #!/bin/bash
sum=1
read -p "请输入一个数字:" num
for i in `seq $num`
do
let sum=$[i*sum]
done
echo $sum

递归目录

function list_files {
for f in `ls $1`
do
   if [ -d "$1/$f" ]
    then
    echo "$2$f"
    list_files "$1/$f" " $2"
      else
      echo "$2$f"
     fi
done
}

list_files "/var/log" ""
image.png

10.函数文件

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

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

二.数组

1.数组介绍:

  • 数组就是把n个变量或者字符内容集合起来用一个名字命名,接着用编号对它们区分的元素集合,这个名字叫数组名
  • 区分不同内容的是编号,叫数组下标
  • 有了数组,就能用一样的名字引用不同的变量或者变量值,并通过数字来识别它们
  • 使用数组也能使代码缩短简洁等好处

简易道理:

将班级里的各位同学的姓名存入到变量中,需要每一个学生对应一个变量,100个学生需要 100个变量,不好维护 name1=张三 name2=李四 ...... 我们可以只用一个变量 将所有学生的都存入student变量中, 将来会取用某一个的学生时,需要用到编号,专业的称呼,下标 数组里的东西都是有相同属性的元素 数组只有一个名字,减少了变量的个数

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

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

2.数组怎么定义

【声明数组】

  • 普通数组可以不事先声明,直接使用 declare -a ARRAY_NAME
  • 关联数组必须先声明,再使用 declare -A ARRAY_NAME

2.1定义方法

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

a=(10 20 30 40 50)

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

b=([0]=10 [1]=20 [2]=30)

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

数组名=($列表名)

b="1 2 3 4 5 6" a=($b)

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

数组名[1]="value"

数组名[2]="value"

a[0]=10

a[1]=20

a[3]=30

这里介绍2种常用的方法:

No.1

小括号将变量值括起来赋值给数组变量,每个变量值之间要用空格分隔。

:数组名:  a     值:10 20 30 40

a=(10 20 30 40)

image.png image.png

No.2

用小括号将变量值括起来,同时采用键值对的形式赋值

:数组名:  b    :值:10 20 30 40

b=([0]=10 [1]=20 [2]=30 [3]40)

3.关联索引

1.下标可以是文字:称为关联索引 键值对的关系 一个公司的的属性

公司名 对应的下标为 name

总经理 对应的下标为 ceo

所在地 对应的下标为 南京

注册资金 对应的下标为 money

2.下标可以不连续,称为稀疏格式 定义关联数组,一定要先申明

[root@localhost ~]#declare -A f
[root@localhost ~]#f[name]=smith
[root@localhost ~]#echo ${f[name]}
smith
不申明没有效果
[root@localhost ~]#a[name]=kgc
[root@localhost ~]#echo ${a[name]}
kgc
[root@localhost ~]#a[m]=1000
[root@localhost ~]#echo ${a[name]}
1000

4 .数组相关命令

数组包括的数据类型

●数值类型

●字符类型:

使用" "或' '定义

【获取数组长度】

a=(1 2 3 4 5)
echo ${#a[*]}  //显示下标总个数
echo ${#a[@]}  //显示下标总个数 

【获取数据列表】

echo ${a[*]}
echo ${a[@]}

【读取下标个数】

[root@localhost ~]# a=(1 2 3 4 5)
                   echo ${!a[*]}
                   echo ${!a[@]}

【数组切片】

 arr=(1 2 3 4 5)
 echo ${arr[@]}			#输出整个数组
echo ${arr[@]:0:2}		#获取 ${数组名[@或*]:起始位置:长度} 的值
echo ${arr1[*]:1:3}
echo ${arr[@]:2:3}
[root@localhost ~]#a=({1..10})
 [root@localhost ~]#echo ${a[@]}    
 1 2 3 4 5 6 7 8 9 10
 [root@localhost ~]#echo ${a[@]:3:4}     跳过前三个 取后四个
 4 5 6 7

echo ${a[@]:3:4}     跳过前三个

【数组替换】

arr=(1 2 3 4 5)

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

arr=(${arr[@]/4/66})	#要实现改变原有数组,可通过重新赋值实现
echo ${arr[@]}

【数组删除】

arr=(1 2 3 4 5)
unset arr				#删除数组
echo ${arr[*]}

arr=(1 2 3 4 5)
unset arr[2]			#删除第三个元素
echo ${arr[*]}

【取出数组中的最大值和最小值】

最大值
 #!/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"