shell函数与数组

2023年 8月 15日 90.9k 0

一.函数

1.函数介绍:

函数的数学表达式
sin cos tan 其实就是定义好了计算公式 函数就是一个功能模块,在函数中写好执行的命令即可
使用函数可以避免代码重复
使用函数可以将大的工程分割为若干小的功能模块,代码的可读性更强

2.函数的组成:

函数名函数体

帮助:help function

3.函数定义:

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


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

}


 3.function 函数名 (){
             命令序列
 }

4.常用函数

函数名() {
           命令序列

}

实例:

image.png

5. 查看函数列表

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

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

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

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

6.删除函数

unset 函数名

注意事项:

1.直接写 函数中调用函数 直接写函数名
2.同名函数 后一个生效
3.调用函数一定要先定义
4.每个函数都是独立的

7.调用函数

函数调用自己

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

8.函数值返回值 return

函数返回值

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

test () {
[ 1−eq2]∣∣echo"1 -eq 2 ] || echo "1−eq2]∣∣echo"1 不等于2" ;return 1
}
ip () {
[[ 1= ([0−9]1,3)˙3[0−9]1,31 =~ ^([0-9]{1,3}.){3}[0-9]{1,3}1= ([0−9]1,3)˙​3[0−9]1,3 ]] ||{ echo "$1 is not vaild ip";return 1; }
#192.168.91.1
}

使用原则

  • 函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
  • 退出状态码必须是0~255,超出时值将为除以256取余

echo $? ;exit 100

return

return 用法

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

}

9.函数变量范围

函数在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

10.函数递归

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

11.函数文件

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

[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

相关文章

服务器端口转发,带你了解服务器端口转发
服务器开放端口,服务器开放端口的步骤
产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
如何使用 WinGet 下载 Microsoft Store 应用
百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

发布评论