目录
定义
[function]函数名(){
命令序列
[return x]
调用方法
函数名 [参数1] [参数2]
函数的作用范围
- 函数在Shell脚本中仅在当前Shell环境中有效
- Shell脚本中变量默认全局有效
- 将变量限定在函数内部使用local命令
- 示例
函数内部变量通过local来实现
通过定义myfun函数,其内部设置为局部变量i
函数内部和外部分别赋值,进行结果验证
例1:两个数求和
[root@localhost ~]# vi sum.sh
#!/bin/bash
#函数求和
sum(){
read -p "第一个数:" num1
read -p "第二个数:" num2
echo "您输入这两个数为 $num1和num2"
sum=$(($num1+$num2))
echo "这两个数的和为:$sum"
}
sum
[root@localhost ~]# chmod +x sum.sh
[root@localhost ~]# ./sum.sh
第一个数:10
第二个数:20
你输入这两个数为10和20
这两个数的和为:30
例2:自定义函数
[root@localhost ~]# vim function
servicect1_usage(){
echo "Usage:service <service-name><start|stop|restart|reload|status>"
return 1
}
chk_centos_ver(){
grep "CentOS.*release 7." /etc/centos-release $> /dev/null && echo "7"
grep "CentOS.*release 6." /etc/centos-release $> /dev/null && echo "6"
grep "CentOS.*release 5." /etc/centos-release $> /dev/null && echo "5"
}
servicect1(){
[[ -z $1 || -z $2 ]] && servicectl_usage
[ $(chk_centos_ver)=="7" ] && systemctl $2 ${
1}.service || service $1 $2
}
[root@localhost ~]# chmod +x function
[root@localhost ~]# source function
[root@localhost ~]# echo 'source /root/function' >> ~/.bashrc
例3:函数的作用范围
[root@localhost ~]# vim fun_scop.sh
myfun(){
local i
i=8
echo $i
}
i=9
myfun
echo $i
[root@localhost ~]# chmod +x fun_scope.sh
[root@localhost ~]# ./fun_scope.sh
8
9
函数参数
参数用法
函数名称 参数1 参数2 参数3 …
参数的表示方法
$1 $2 $3 $4 $5 $6 … ${10} ${11} …
例4:函数的参数
[root@localhost ~]# vim write_log.sh
#!/bin/bash
mydir=|/data/ outfile="${mydir}/my.log"
[ -e "${mydir}" ] || mkdir -p ${
mydir}
appendfile(){
echo "$2" >> "$1"
}
appendfile ${
outfile} "first line content."
appendfile ${
outfile} "second line content."
[root@localhost ~]# chmod +x write_log.sh
[root@localhost ~]# ./write_log.sh
[root@localhost ~]# cat /data/my.log
first line content
second line content
递归函数
调用自己本身的函数
例5:递归函数
[root@localhost ~]# vim fun_recursion.sh
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" ""
[root@localhost ~]# chmod +x fun_recursion.sh
数组应用场景
- 获取数组长度
- 获取元素长度
- 遍历元素
- 元素切片
- 元素替换
- 元素删除
- …
数组定义方法
- 方法一
数组名=(value0 value1 value2 …) - 方法二
数组名=([0]=value [1]=value [2]=value …) - 方法三
列表名=“value0 value1 value2 …”
数组名=($列表名) - 方法四
数组名[0]=“value”
数组名[1]=“value”
数组名[2]=“value”
数组包括的数据类型
- 数值类型
- 字符类型
-使用"" 或 ‘’定义
获取数组长度
${数组名[@/*]}
[root@localhost ~]# arr_number=(1 2 3 4 5);
[root@localhost ~]# arr_length=${
#arr_number[*]}
[root@localhost ~]# echo $arr_length
5
读取某下标赋值
${数组名[下表]}
[root@localhost ~]# for v in ${
arr_number[@]}
>do
> echo $v
>done
1
2
3
4
5
数组遍历
数组切片
${数组名[@/*]:起始位置:长度}
[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# echo ${
arr[@]}
1 2 3 4 5
[root@localhost ~]# echo ${
arr[@]:0:2}
1 2
[root@localhost ~]# echo ${
arr[@]:2:3}
3 4 5
数组的替换
${数组名[@/*]/查找字符/替换字符}
[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# echo ${
arr[@]/4/66}
1 2 3 66 5
[root@localhost ~]# echo ${
arr[@]}
1 2 3 4 5
[root@localhost ~]# arr=(${
arr[@]/4/66})
[root@localhost ~]# echo ${
arr[@]}
1 2 3 66 5
数组删除
unset
Shell脚本调试
echo命令
bash命令
- 命令语法
sh [-nvx] 脚本名 - 常用选项
-n:不会执行该脚本,仅查询脚本语法是否有问题,如果没有语法问题就不显示任何内容,如果有问题会提示报错。
-v:在执行脚本时,先将脚本的内容输出到屏幕上然后执行脚本,如果有错误,也会给出错误提示。
-x:将执行的脚本内容输出到屏幕上,这个是对调试很有用的参数。
set命令
- set -x:开启调节模式
- set +x:关闭调节模式
例:
[root@localhost ~]# vim grade.sh
#!/bin/bash
set -x//开启调试模式
read -p"请输入您的分数(0-100):" GRADE
if [ $GRADE -ge 85 ]&&[$GRADE -le 100 ]
then
echo "$GRADE 分!优秀”_set tx//关闭调试模式
elif [$GRADE -ge 70 ]&&[ $GRADE -le 84 ]
then
echo "$GRADE分,仓格".else
echo "$GRADE 分?不合格”
fi
冒泡排序
方法一
[root@localhost ~]# vim maopao.sh
#!/bin/bash#冒泡排序
score=(70 30 40 100 50 60)
for ((i=1; i<$ {
#score[*]};i++))
do
for ((j=o; j< $ {
#score[*]}-$i ; j++))
do
if [ $ {
score[j]} -gt,$ {
score[(($j+1))]}]
then temp=$ {
score[j]}
score[j]=${
score[($j+1))]}
score[(($j+1))]=$temp
fi
done
done
echo $ {
score[*]}
[root@localhost ~]# chmod +x maopao.sh
[root@localhost ~]# ./maopao.sh
30 40 50 60 70 100
方法二
[root@localhost ~]# vim maopao1.sh
#!/bin/bash
#冒泡排序
k=0
while true
do
read -p"是否需要输入数值?" do
if [$do ="no""]
then break
fi
read -p."请输入第$(($k+1))个元素”key
score[$k]=$key
let k++
done
for ((i=1;i<$ {
#score[*]};i++))
do
for ((j=0; j< $ {
#score[*]}-$i ; j++))
do
if [ $ {
score[j]} -gt,$ {
score[j+1]}]
then temp=${
score[j]}
score[j]=$ {
score[j+1]}
score[j+1]=$temp
fi
done
done
echo ${
score[*]}
[root@localhost ~]# chmod +x maopao1.sh
[root@localhost ~]# ./maopao1.sh
是否需要输入数值?y
请输入第1个元素5
是否需要输入数值?y
请输入第2个元素22
是否需要输入数值?y
请输入第3个元素15
是否需要输入数值?y
请输入第4个元素3
是否需要输入数值?y
请输入第5个元素120
是否需要输入数值?y
请输入第6个元素50
是否需要输入数值?no
3 5 15 22 50 120