目录
一、Shell函数格式
①
function 函数名 {
命令序列
[return x]或者exit可退出循环。
}
函数名
②
函数名() {
命令序列
}
函数名
二、函数的调用
1、函数调用是从上到下的。
2、函数名必须是唯一,重复调用时会覆盖。
例子:
用函数配置本地yum源
[root@node home]# cat local.sh
#!/bin/bash
function backuprepo {
cd /etc/yum.repos.d
mkdir repo.bak
mv *.repo repo.bak
mount /dev/sr0 /mnt > /dev/null
}
makelocalrepo(){
echo '[local]
name =local
baseurl=file:///mnt
enable=1
gpgcheck=0' > local.repo
}
uselocalrepo (){
yum clean all > /dev/null
yum makecache > /dev/null
yum install -y httpd > /dev/null
}
backuprepo
makelocalrepo
uselocalrepo
三、函数返回值
return表示退出函数并返回一个退出值。
使用原则:
1、函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
2、退出状态码必须是0~255,超出时值将为除以256取余
[
root@node hanshu]# cat test1.sh
#!/bin/bash
function test1 {
read -p "请输入一个数字: " num
return $[$num*2]
}
test1
echo $?
#!/bin/bash
function test1 {
read -p "请输入一个数字: " num
return $[$num*2]
}
test1
echo $? (return中echo $? 非零值也是正确的)
四、传参
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…即使用位置参数来实现参数传递。
#!/bin/bash
sum () {
read -p "请输入一个数值:" NUM1
read -p "请输入第二个数值:" NUM2
echo "你输入的两个数为: $NUM1和$NUM2"
SUM=$[ $NUM1 + $NUM2 ]
echo "两个数的和为: $SUM"
}
sum
可写多个模块,用哪个就调用哪个。
位置参数例子
五、函数变量的作用范围
函数在Shell脚本中仅在当前Shell环境中有效
Shell脚本中变量默认全局有效
将变量限定在函数内部使用local命令
定义变量加“#” 就只能在内部使用。
六、阶乘
定义判断目录下的一个文件,如果是文件,return返回值为80,
如果不是,return返回值为40
七、函数的递归
定义:函数自己调用自己的本身
例子:
列出目录内文件列表,目录用蓝色表示,文件显示层级关系
递归方式计算你输入的数值阶乘
八、数组
1、定义:
数组是存放相同类型数据的集合,在内存中开辟了连续的空间,通常配合循环使用
2、数组的分类
普通数组:不需要声明直接定义,下标索引只能是整数
关联数组:需要用declare -A声明否则系统不识别,索引可以是字符串
3、格式
方法一:
直接把要加入数组的元素用小括号括起来,中间用空格分开
数组名=(value0 value1 value2 …)
num=(11 22 33 44)
方法二:
精确的给每一个下标索引定义一个值加入数组,索引数字可以不连续
数组名=([0]=value [1]=value [2]=value …)
num=([0]=55 [1]=66 [2]=77 [4]=88)
方法三:
先把要加入数组的元素全部先赋值给一个变量,然后引用这个变量加入到数组
列表名=“value0 value1 value2 …”
数组名=(
列
表
名
)
n
u
m
=
(
列表名) num=(
列表名)num=(list)
方法四:
可以把命令的结果用小括号括起来添加到数组,那么数组会以空格或者制表符区分每一个元素
num=(`cat /etc/passwd`)
[root@localhost ~]# echo ${#num[*]}
111
[root@localhost ~]# echo ${num[0]}
root: x:0:0:root:/root:/bin/bash
注意以下特殊方式:
[root@node ~]# list[0]=1 //没有定义数组之前也可这样直接定义元素
[root@node ~]#
[root@node ~]# echo ${list[*]}
1
[root@node ~]# list=([0]=1 [1]=2 [3]=4) //定义数组时所以可以是不连续的
[root@node ~]# echo ${list[*]}
1 2 4
[root@node ~]# echo ${!list[*]} //没有2这个索引,数组元素为3
0 1 3
[root@node ~]# ff=(1 2 zhangsan lisi) //不是同一数据类型的也可定义为一个数组
[root@node ~]#
[root@node ~]#
[root@node ~]# echo ${ff[*]}
1 2 zhangsan lisi
4、元素切片
[root@node ~]# arr=(1 2 3 4 5 6 7 8)
[root@node ~]# echo ${arr[]:2:3} //提取从索引2开始的3个元素
3 4 5
[root@node ~]# echo ${arr[]:2:2}
3 4
[root@node ~]# echo ${arr[*]:0:2}
1 2
[root@node home]# arr=(1 2 3 4 5 6 7 8)
[root@node home]# echo ${arr[]}
[root@node home]# echo ${arr[]:2:3}
[root@node home]# echo ${arr[@]/3/55}
[root@node home]# echo ${arr[a]/8/55}
5、元素替换
定义或替换某一个元素
[root@node ~]# fruit[0]=pear
[root@node ~]#
[root@node ~]# echo ${fruit[*]}
pear banana orange
[root@node ~]# echo ${fruit[]/banana/ba} //临时替换
pear ba orange
[root@node ~]# echo ${fruit[]}
pear banana orange
6、元素删除
[root@node ~]# unset fruit[0]
[root@node ~]#
[root@node ~]# declare -a | grep fruit
declare -a fruit=‘([1]=“banana” [2]=“orange”)’
7、数组删除
[root@node ~]# unset fruit
8、冒泡排序
#!/bin/bash
array=(90 70 80 100 30 66)
echo "old_array:${array[*]}"
lt=${#array[*]}
#定义比较轮数,比较轮数为数组长度-1,从1开始
for((i=1;i<$lt;i++))
#确定比较元素的位置,比较相邻两个元素,较大的数放在后面,比较次数随比较轮数而较少
do
for ((j=0;j<$lt-i;j++))
do
#定义第一个元素的值
first=${array[$j]}
k=$[$j+1]
second=${array[$k]}
#如果第一个元素比第二个元素大就互换
if [ $first -gt $second ];then
#把第一个元素值保存到历史变量中
temp=$first
#把第二个元素值赋给第一个元素
array[$j]=$second
#把临时变量赋值赋给第二个元素
array[$k]=$temp
fi
done
done
echo "new_array:${array[@]}"
总结:
本章说到了
一、Shell函数格式
二、函数的调用
三、函数返回值
四、传参
五、函数变量的作用范围
六、阶乘
七、函数的递归
八、数组
数组定义、数组的分类、格式、元素切片、元素替换、元素删除、数组删除、冒泡排序
对于生产上的需求函数调用用的还是比较多的。对于一些模块化,可以随时调用。