shell函数及数组

目录

1.函数

2.函数定义方式

3.函数的调用

4.函数库文件

4.1函数库文件定义

4.2函数库问价的调用

5.数组

5.1数组的定义

 5.2数组的操作

6.练习

6.1编写函数,实现打印绿色OK和红色FAILED  判断是否有参数,存在为Ok,不存在为FAILED

6.2 编写函数,实现判断是否无位置参数,如无参数,提示错误

6.3 编写函数实现两个数字做为参数,返回最大值

6.4编写函数,实现两个整数位参数,计算加减乘除。

6.5 将/etc/shadow文件的每一行作为元数赋值给数组

6.6使用关联数组统计文件/etc/passwd中用户使用的不同类型shell的数量

6.7 使用关联数组按扩展名统计指定目录中文件的数量

1.函数

通俗地讲,所谓函数就是将一组功能相对独立的代码集中起来,形成一个代码块,这个代码可以完成某
个具体的功能。从上面的定义可以看出, Shell 中的函数的概念与其他语言的函数的概念并没有太大的区
别。从本质上讲,函数是一个函数名到某个代码块的映射。也就是说,用户在定义了函数之后,就可以
通过函数名来调用其所对应的一组代码。
使用 shell 函数优势
1 、把相同的程序段定义为函数,可以减少整个程序段代码量,提升开发效率。
2 、增加程序段可读性、易读性,提升管理效率。
3 、可以实现程序功能模块化,使得程序具备通用性(可移植性)。

2.函数定义方式

function 函数名 () {
指令
return
}
简化写法 1
function 函数名 {
指令
return
}
简化写法 2
函数名 () {
指令
return
}

3.函数的调用

Shell 中,函数调用的基本语法如下:
function_name param1 param2 …
在上面的语法中, function_name 表示函数名称,其后面跟的 param1 param2… 表示函数的参数。
Shell 的函数参数的语法比较特殊。实际上, Shell 将脚本参数和函数参数做了统一地处理。也就是说,
Shell 采用了相同的方法来处理脚本的参数和函数参数。
1 )调用函数:直接执行函数名即可。
函数名
2 )带参数的函数执行方法:
函数名 参数

4.函数库文件

4.1函数库文件定义

创建一个函数库文件的过程非常类似于编写一个 Shell 脚本。脚本与库文件之间的唯一区别在于函数
库文件通常只包括函数,而脚本中则可以既包括函数和变量的定义,又包括可执行的代码。此处所
说的可执行代码,是指位于函数外部的代码,当脚本被载入后,这些代码会立即被执行,毋需另外
调用。

4.2函数库问价的调用

. filename
其中,参数 filename 表示库文件的名称,必须是一个合法的文件名。库文件可以使用相对路径,也
可以使用绝对路径。另外,圆点命令和库文件名之间有一个空格。

5.数组

5.1数组的定义

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

array = (value1value2value3...)
方法二:用小括号将变量值括起来,同时采用键值对的形式赋值。当通过键值对定义数组时,用户所提
供的键值对中的元素索引不一定是连续的,可以任意指定要赋值的元素的索引。之所以可以这样操作,
是因为用户已经显式指定了索引, Shell 就可以知道值和索引的对应关系
array = ([0] = one[1] = two[2] = three...[n] = valuen)
方法三:分别定义数组变量的值
array[0]=a;array[1]=b;array[2]=c
方法四:动态的定义变量,并使用命令的输出结果作为数组的内容。
array=( 命令 )
方法五:通过 declare 语句定义数组
declare-aarray
关联数组必须使用带有 - A 选项的 declare 命令创建。

 5.2数组的操作

获取所有元素:
#echo ${array[*]}   #* @ 都是代表所有元素
获取元素下标:
#echo ${!array[@]}
#echo ${!array[*]}
获取数组长度:
#echo ${#array[*]}
#echo ${#array[@]}
获取第一个元素:
#echo ${array[0]}
添加元素:
#array[3]=d
添加多个元素:
#array+=(efg)
以切片方式获取部分数组元素 :( 用户得到的是一个空格隔开的多个元素值组成的字符串 )
${array[@|*]:start:length}
删除第一个元素:
#unset array[0]# 删除会保留元素下标
删除数组:
#unset array

6.练习

6.1编写函数,实现打印绿色OK和红色FAILED  判断是否有参数,存在为Ok,不存在为FAILED

[root@manage 20221230]# cat homework1.sh 
#!/bin/bash
#########################
#File name:homework1.sh
#Version:v1.0
#Email:admin@test.com
#Created time:2022-12-30 14:46:34
#Description:
#########################
func1()    定义函数
{
	if [ -z $1 ]
	then
		echo -e "\033[31m failed \033[0m"    
	else	
		echo -e "\033[32m ok \033[0m"
	fi
}

func1      调用函数

6.2 编写函数,实现判断是否无位置参数,如无参数,提示错误

[root@manage 20221230]# cat homework2.sh 
#!/bin/bash
#########################
#File name:homework2.sh
#Version:v1.0
#Email:admin@test.com
#Created time:2022-12-30 14:54:55
#Description:
#########################
func2()
{
	[ -z $1 ] && echo "错误:没有位置参数" && exit 1   条件测试判断
}

func2 

6.3 编写函数实现两个数字做为参数,返回最大值


[root@manage 20221230]# vim homework3.sh 
[root@manage 20221230]# bash homework3.sh 
please input two number:23 12
23 is max
[root@manage 20221230]# cat homework3.sh 
#!/bin/bash
#########################
#File name:homework3.sh
#Version:v1.0
#Email:admin@test.com
#Created time:2022-12-30 15:01:16
#Description:
#########################
func3()
{
	if [ $1 -eq $2 ]
	then
		echo "所传入数字相等:"
	elif
	   [ $1 -gt $2 ]
	then
		result=$1
                echo "$result is max"
	else
		result=$2
		echo "$result is max"
	fi
} 
read -p "please input two number:" num1 num2    键盘输入两个数字
func3 $num1 $num2   调用函数

6.4编写函数,实现两个整数位参数,计算加减乘除。

[root@manage 20221230]# cat homework4.sh 
#!/bin/bash
#########################
#File name:homework4.sh
#Version:v1.0
#Email:admin@test.com
#Created time:2022-12-30 15:09:31
#Description:
#########################
func4()
{
	echo "$1+$2=$(($1+$2))"    shell语言中的运算符
	echo "$1-$2=$(($1-$2))"
	echo "$1*$2=$(($1*$2))"
	echo "$1/$2=$(($1/$2))"
}
read -p "please input two int number:" num1 num2
func4 $num1 $num2

6.5 /etc/shadow文件的每一行作为元数赋值给数组

[root@manage 20221230]# cat homework5.sh 
#!/bin/bash
#########################
#File name:homework5.sh
#Version:v1.0
#Email:admin@test.com
#Created time:2022-12-30 15:16:59
#Description:
#########################
j=0
for i in `cat /etc/shadow`
do
	array[$j]=$i
	let j++
done
read -p "input you want line:" line
echo ${array[$line]}

6.6使用关联数组统计文件/etc/passwd中用户使用的不同类型shell的数量

[root@manage 20221230]# cat homework6.sh 
#!/bin/bash
#########################
#File name:homework6.sh
#Version:v1.0
#Email:admin@test.com
#Created time:2022-12-30 16:43:57
#Description:
#########################
declare -A array    定义数组为关联数组
for i in `cut -d : -f7 /etc/passwd`   剪切出shell类型
do 
	let array[$i]=array[$i]+1         统计shell类型次数
done
for sub in ${!array[*]}               取出array数组的下标
do
	echo $sub:${array[$sub]}
done

6.7 使用关联数组按扩展名统计指定目录中文件的数量

[root@manage 20221230]# cat homework7.sh 
#!/bin/bash
#########################
#File name:homework7.sh
#Version:v1.0
#Email:admin@test.com
#Created time:2022-12-30 16:57:54
#Description:
#########################
declare -A array
for i in `ls | cut -d . -f 2-`
do
	let array[$i]=array[$i]+1
done
for sub in ${!array[*]}
do
	echo "$sub:${array[$sub]}"
done 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值