如何使用函数
- 定义
- 调用
你准备一个只存函数的文件
函数一定要先定义在使用
函数变量的作用范围
加local关键字可以让变量只在函数中生效,不会影响外界环境。
函数的返回值
如果使用函数那么$?使用就会受限
我们可以使用return 自定义$?的返回值来判断函数中的命令是否成功
函数的传递参数
需要注意
脚本的$1 $2
函数的$1 $2
是没有关系的
函数的$1 $2是指跟在函数后面的值
eval
函数的格式
方法一:
[function] 函数名 (){
命令序列
[return x] #使用return或者exit可以显式的结束函数
}
方法二:
函数名(){
命令序列
}
数组
普通数组:下标是数字
关联数组:下标是有含义的字符串
变量:存储单个元素的内存空间
数组:存储多个元素的连续的内存空间,相当于多个变量的数据集合 1对多
数组名和索引 对应下标
索引的编号从0开始 属于数组索引
索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash4.0版本之后开始支持
使用数组时要先声明:
declare -a 普通数组 (不需要手动声明,系统帮你声明)
declare -A 数组名 (关联数组要手动声明) 不声明 值会存不进去
定义数组
- 数组名=数组值 中间用空格隔开(1 2 3 4 5 6)
- 数组名[下标1]=值1
数组名[下标2]=值2
………………………
数组名[下标n]=值n
例子:
a=(10 20 30 40 50)
调用数组
echo ${a[0]} 调用第一个值
echo ${a[1]} 调用第二个值
…………………………
echo ${a[n]} 调用第n个值
全部调用
echo ${a[@]}
echo ${a[*]}
显示数组的值的个数
echo ${#a[@]}
显示所有下标
echo ${!a[@]}
删除数组
unset 数组名 将整个数组删除
unset a[0] 只删除数组的第一个值
示例脚本:
查看当前的操作系统:
#!/bin/bash
if grep -iq centos /etc/os-release
then echo "该系统是centos"
elif grep -iq ubuntu /etc/os-release
then echo "该系统是ubuntu"
else
echo "该系统既不是centos 也不是ubuntu"
fi
传参
【函数返回值:】
return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值
使用原则:
1、函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
2、退出状态码必须是0~255,超出时值将为除以256取余
【函数变量的作用范围:】
函数在Shell脚本中仅在当前Shell环境中有效
Shell脚本中变量默认全局有效
将变量限定在函数内部使用local命令
local
【#阶乘】
阶乘是基斯顿·卡曼于 1808 年发明的运算符号,是数学术语
一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0和1的阶乘为1,自然数n的
阶乘写作n!
n!=1×2×3×...×n
阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n
n!=n(n-1)(n-2)...1
n(n-1)! = n(n-1)(n-2)!
数组
变量:存储单个元素的内存空间
数组:存储多个元素的连续的内存空间,相当于多个变量的集合
数组名和索引
-索引的编号从0开始,属于数值索引
-索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash 4.0版本之后开始支持
-bash的数组支持稀疏格式(索引不连续)
数组中可以存放多个值,bash shell只支
持一堆数组不支持多组数组,初始化时不需要定义数组的大小
与大部分编程语言类似,数组元素的下标由0开始
shell数组用括号来表示,元素用空格符号隔开
在shell语句中,使用遍历数组时,数组格式要写成${arr[@]}或${arr[*]}
数组的语法格式
方法一(一次赋值全部元素):
数组名=(value0 value1 value2 ...)
a=(10 20 30 40 50)
方法二(只赋值特定元素):
数组名=([0]=value [1]=value [2]=value ...)
b=([0]=10 [1]=20 [2]=30)
方法三:
列表名="value0 value1 value2 ..."
数组名=($列表名)
[root@localhost data]#b="1 2 3 4 5 6"
[root@localhost data]#c=$b
[root@localhost data]#echo ${c[*]}
1 2 3 4 5 6
方法四(一次只赋值一个元素):
数组名[0]="value"
数组名[1]="value"
数组名[2]="value"
方法五:交互式
数组包括的数据类型
●数值类型
●字符类型:
使用" "或' '定义
获取数组的长度
a=(1 2 3 4 5)
echo ${#a[*]}
echo ${#a[@]}
【获取数据列表】
echo ${a[*]}
echo ${a[@]}
【读取某下标赋值】
arr_index2=${a[2]}
【读取下标个数】
[root@localhost ~]# a=(1 2 3 4 5)
echo ${!a[*]}
【数组遍历】
【数组切片】
arr=(1 2 3 4 5)
echo ${arr[@]} #输出整个数组
echo ${arr[@]:0:2} #获取 ${数组名[@或*]:起始位置:长度} 的值
echo ${arr1[*]:1:3}
echo ${arr[@]:2:3}
【数组替换】
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
取数组的最小值