一.函数
1.函数介绍:
函数的数学表达式
sin cos tan 其实就是定义好了计算公式 函数就是一个功能模块,在函数中写好执行的命令即可
使用函数可以避免代码重复
使用函数可以将大的工程分割为若干小的功能模块,代码的可读性更强
2.函数的组成:
函数名
和函数体
帮助:help function
3.函数定义:
1.function 函数名 {
命令序列
}
2.函数名() {
命令序列
}
3.function 函数名 (){
命令序列
}
4.常用函数
函数名() {
命令序列
}
实例:
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命令
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" ""
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)
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