一.Shell函数
1.1、函数的格式
法一:
[function] 函数名 (){
命令序列
[return x]
}
法二:
函数名(){
命令序列
}
#!/bin/bash
h () {
echo "hello"
}
w () {
echo "world"
}
nihao () {
h
w
}
h
w
nihao
[root@localhost data]# bash a.sh
hello
world
hello
world
1.2、函数的返回值
-
return表示退出函数并返回一个退出值,脚本中可以用$?变量表示该值
-
函数的使用原则
-
函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码;
-
退出状态码必须是0~255,超出时值将为除以256取余。
-
#!/bin/bash
u () {
if [ $USER = root ]
then echo "是管理员用户"
else
echo "不是管理员用户"
return 1
fi
}
u
[root@localhost why]# bash a.sh
是管理员用户
[root@localhost why]# su lisi
[lisi@localhost why]$ cd
[lisi@localhost ~]$ cd /why/
[lisi@localhost why]$ bash a.sh
不是管理员
1.3、函数的传参数
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…即使用位置参数来实现参数传递。
#!/bin/bash
sum (){
sum=$[$1 +$2]
echo $sum
}
read -p "请输入第一个参数:" n1
read -p "请输入第一个参数:" n2
sum $n1 $n2
[root@localhost why]# bash ss.sh
请输入第一个参数:5
请输入第一个参数:10
15
1.4、使用函数文件
#!/bin/bash
color () {
RED="echo -e \E[31m"
GREEN="echo -e \E[32m"
END="\E[0m"
}
1.5、函数的作用范围
[root@localhost ~]# func1() { name=li ; echo $name; }
[root@localhost ~]# func1
li
[root@localhost ~]# echo $name
li
[root@localhost ~]# name=why;func1() { local name=li;echo $name; };echo $name
why
#加上local变量即可将变量限制在函数内
1.6、函数的递归
#!/bin/bash
fact () {
#判断传入的参数,如果是0,则直接输出1
if [ $1 -eq 0 -o $1 -eq 1 ]
then
echo 1
else
#如果传入的参数不是1,则函数调用函数自身,传入参数计算
echo $[$1* $(fact $[$1-1])]
fi
}
fact $1
二.Shell数组
定义数组格式:
-
数组名=(value0 value1 value2 value3 …)
-
数组名=([0]=value [1]=value1 [2]=value2 …)
-
列表名="value0 value1 value2 value3 … "
数组名=($列表名)
-
数组名[0]=“value1”
数组名[1]=“value2”
数组名[2]=“value3”
数组的包括数据类型
- 数值型
- 字符型
- 混合型数值加字符
使用" "或’ '定义单引号或双引号括起来
[root@localhost ~]# a=(1 2 3 4 5)
0 1 2 3 4
[root@localhost ky15]#declare -a
declare -a a='([0]="1" [1]="2" [2]="3" [3]="4" [4]="5")'
[root@localhost ~]# echo ${!a[*]}
#查看下标
0 1 2 3 4
[root@localhost ~]# echo ${a[0]}
#数组的取值 数组加下标
1
输出第一一个数值 注意是从0开始计算
列出所有参数
[root@localhost ~]# echo ${a[*]} //*代表所有参数
1 2 3 4 5
[root@localhost ~]# echo ${a[@]} //@同*
1 2 3 4 5
共有多少个位置
[root@localhost ~]# echo ${#a[@]} //前面加#数组的长度
5
[root@localhost ~]# echo ${#a[*]}
5
#数组分隔
[root@localhost ~]# a=(1 2 3 4 5)
[root@localhost ky15]#echo ${a[@]:0:5}
1 2 3 4 5
[root@localhost ky15]#a[1]=9
#数组替换
[root@localhost ky15]#echo ${a[1]}
9
[root@localhost ky15]#echo ${a[@]}
1 9 3 4 5
[root@localhost ky15]#echo ${b[@]/西瓜/葡萄}
#只是显示没有真正的修改
橘子 香蕉 葡萄
[root@localhost ky15]#echo ${b[@]}
橘子 香蕉 西瓜
[root@localhost ~]#list="1 2 3 4 5"
#先定义列表
[root@localhost ~]#list1=($list)
#再定义数组
[root@localhost ~]#echo ${list1[@]}
1 2 3 4 5
三.冒泡排序
#!/bin/bash
a=(20 80 75 13 97 53 144 )
for ((j=1;j<${#a[@]};j++))
do
for ((i=0;i<${#a[@]}-j;i++))
do
if [ ${a[$i]} -gt ${a[$i+1]} ]
then
tmp=${a[$i+1]}
a[$i+1]=${a[$i]}
a[$i]=$tmp
fi
done
done
echo ${a[*]}
[root@localhost why]# bash pao.sh
13 20 53 75 80 97 144