Shell ❀ 函数与数组

Posted 无糖可乐没有灵魂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell ❀ 函数与数组相关的知识,希望对你有一定的参考价值。

文章目录

六、函数与数组

1、函数

主要介绍在Shell编程中函数的定义与使用方法、语法结构以及案例解析;

1.1 函数定义

函数就是将一组功能相对独立的代码集中起来,形成一个代码块,这个代码块可以完成某个具体的功能,从上面的定义可以看出,shell中的函数的概念与其他语言中的函数定义并没有太大的区别,从本质上讲,函数就是一个函数名到某个代码块的映射关系;

1.2 函数的优势

  • 把相同的程序段定义为函数,可以减少整个程序段代码量,提升开发效率;
  • 增加程序段可读性、易读性,提升管理效率;
  • 可以实现程序功能模块化,使得程序具有通用性;

1.3 函数语法

function 函数名() 
指令
return       #返回语句,非必需参数,只能返回某个0-255之间的整数值

函数写法可以简化,简化1格式:

function 函数名 
指令
return

简化2格式:

函数名() 
指令
return

1.4 函数调用

在shell中函数的调用方法如下:

function_name param1 param2 ...
# function_name为函数名称,param为函数参数
# return语句只能返回某个0-255之间的整数值

1.5 操作案例

  1. 脚本判断某个IP地址段那些主机在线;
[root@localhost shell]# cat a1.sh 
#!/bin/bash

PING() 
	for I in 1..10;do
		if ping -c 1 -w 1 192.168.1.$I &> /dev/null; then
			echo "192.168.1.$I is up!"
		else
			echo "192.168.1.$I is down!"
		fi
	done


#函数调用
PING

使用函数传入参数;

[root@localhost shell]# cat a2.sh 
#!/bin/bash

PING() 
	if ping -c 1 -w 1 $1 &> /dev/null;then 
		echo "$1 is up!"
	else
		echo "$1 is down!"
	fi


#使用for循环引入参数值赋予函数调用
for I in 1..10;do
	PING 192.168.1.$I
done

使用函数返回值判断;

[root@localhost shell]# cat a3.sh 
#!/bin/bash

PING() 
	if ping -c 1 -w 1 $1 &> /dev/null;then
    #$1为位置变量,则$1就代表192.168.1.$I
		return 0
	else 
		return 1
	fi


#函数的返回结果为不同的IP地址,则这些IP地址为$1位置变量
for I in 1..10;do
	PING 192.168.1.$I
   #调用函数
	if [ $? -eq 0 ];then
		echo "192.168.1.$I is up!"
	else
		echo "192.168.1.$I is down!"
	fi
done
  1. 使用脚本循环判断一个参数作为用户名是否存在,存在即返回UID与shell;不存在返回错误状态码;
[root@localhost shell]# cat a4.sh 
#!/bin/bash

USER() 
	if id $1 &> /dev/null;then
		echo "`grep ^$1 /etc/passwd | cut -d : -f 3,7`"
		return 0
	else
		echo "no $1"
		return 1
	fi


read -p "please input your username:" username
until [ $username == q -o $username == Q ];do
	USER $username
	if [ $? -eq 0 ];then
		read -p "please input again:" username
	else
		read -p "no $username,please input again:" username
	fi
done

1.6 函数库文件

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

. filename
# filename为库文件名称

1.7 递归函数

​ 递归函数就是反复调用自身;

[root@localhost shell]# cat a5.sh 
#!/bin/bash

fact() 
	local num=$1
	local fac
	if ((num==1));then
		fac=1
	else
		((dec=num-1))
		fact $dec
		fac=$?
		fac=`expr $num \\* $fac`
	fi
	return $fac


fact $1
echo $?

2、数组

主要介绍在Shell编程中数组的定义与使用方法、语法结构以及案例解析;

2.1 数组定义

  • 用小括号将变量值括起来赋值给数组变量,每个变量使用空格间隔;
array=(value1 value2 ...)
  • 用小括号将变量括起来,使用键值对方式进行赋值;
array=([1]=one [2]=two [3]=three)
  • 通过分别定义数组变量方法;
array[0]=a;array[1]=b;array[2]=c
  • 动态的定义变量,并使用命令的输出结果作为数组的内容;
array=( 命令 )

2.2 定义股关联数组

# 申明关联数组变量
[root@localhost shell]# declare -A ass_array1
[root@localhost shell]# declare -A ass_array2

2.3 数组的赋值

赋值格式

数组名[索引]=变量值

操作案例

# 单个数据赋值
[root@localhost shell]# ass_array1[index1]=paper
[root@localhost shell]# ass_array1[index2]=apple
[root@localhost shell]# ass_array1[index3]=orange
[root@localhost shell]# ass_array1[index4]=peach
# 多组数据赋值
[root@localhost shell]# ass_array2=([index1]=tom [index2]=jack [index3]=alice [index4]='bash shell')

2.4 数组操作

# 获取所有元素,@与*同意
[root@localhost shell]# echo $ass_array2[@]
888 444 555 666 777 111 222 333
# 获取元素下标
[root@localhost shell]# echo $!ass_array2[@]
index8 index4 index5 index6 index7 index1 index2 index3
# 获取数组长度
[root@localhost shell]# echo $#ass_array2[@]
8
# 查询第一个元素
[root@localhost shell]# echo $ass_array2[0]
# 添加元素
[root@localhost shell]# ass_array2[3]=d
[root@localhost shell]# echo $ass_array2[@]
888 444 555 666 777 111 222 333 d
# 添加多个元素
[root@localhost shell]# ass_array2+=(e f g)
# 删除某个元素
[root@localhost shell]# unset ass_array2[index1]
# 删除数组
[root@localhost shell]# unset ass_array2

2.5 数组操作案例

  1. 遍历数组
# 使用数组元素索引
[root@localhost shell]# cat a1.sh 
#!/bin/bash

IP=(192.168.1.1 192.168.1.2 192.168.1.3)
for (( i=0;i<$#IP[@];i++ ));do
	echo $IP[$i]
done
[root@localhost shell]# chmod a+x a1.sh 
[root@localhost shell]# ./a1.sh 
192.168.1.1
192.168.1.2
192.168.1.3

# 使用数组元素个数
[root@localhost shell]# cat a2.sh 
#!/bin/bash

IP=(192.168.1.1 192.168.1.2 192.168.1.3)
for IP in $IP[@] ;do
	echo $IP
done
[root@localhost shell]# chmod a+x a2.sh 
[root@localhost shell]# ./a2.sh 
192.168.1.1
192.168.1.2
192.168.1.3
  1. 将字符串里的字母逐个放入数组中,并输出到 标准输出
[root@localhost shell]# cat a4.sh 
#!/bin/bash

chars='abcdefg'
for (( i=0;i<$#chars;i++ ));do
	array[$i]=$chars:$i:1
	echo $array[$i]
done

以上是关于Shell ❀ 函数与数组的主要内容,如果未能解决你的问题,请参考以下文章

Shell ❀ 函数与数组

Shell ❀ 函数与数组

shell编程函数与数组

shell函数与数组

Shell编程之函数与数组

Shell函数与数组