Shell编程之函数
Posted Richard_Chiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell编程之函数相关的知识,希望对你有一定的参考价值。
Shell编程之函数
- 将命令序列按格式写在一起
- 可方便重复使用命令序列
Shell函数定义:
方法一:
#!/bin/bash
#定义函数①
function 函数名
命令序列
######## main ########
#调用函数
例:
#!/bin/bash
#定义的函数
function hello
echo "hello world"
######## main ########
#调用的函数
hello
方法二:
#!/bin/bash
#定义函数②
函数名 ()
命令序列
######## main ########
#调用函数
例:
#!/bin/bash
user ()
useradd $name
echo 123456 | passwd --stdin $name
######## main ########
read -p "请输入要创建的用户名:" name
#调用函数
user
函数返回值
return
表示退出函数并返回一个退出值,脚本中可以用echo $?
变量显示该值,return 1 退出函数并返回,返回值为1
使用原则:
- 函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
- 退出状态码必须是0~255, 超出时值将为除以256取余
示例:
#!/bin/bash
function test
read -p "请输入一个数值:" num
return $[$num * 2]
######## main ########
test
echo $?
[root@localhost data]# bash demo1.sh
请输入一个数值:100
200
#最大不能超过255的范围,如果需要则必须调用echo,所以:
test ()
read -p "请输入一个数值:" num
echo $[$num * 2]
######## main ########
result=$(test)
echo $result
[root@localhost data]# bash demo1.sh
请输入一个数值:300
600
1.形式
形参:定义一个函数void add(int a, int b),这里的a和b就是形参。
实参:当你进行函数调用的时候,add(1, 2),这里的1和2就是实参
2.使用
形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。
实参出现在主调函数中,进入被调函数后,实参变量也不能使用。
Shell的函数传参
函数传参:
sum1 ()
sum=$[$1 + $2]
echo $sum
######## main ########
read -p "输入第一个参数: " first
read -p "输入第二个参数: " second
result=$(sum1 $first $second)
echo $result
[root@localhost data]# bash demo2.sh
输入第一个参数: 10
输入第二个参数: 20
30
//如果用此方法写函数体外的$1$2与函数体内的$1$2是有区别的
#!/bin/bash
sum1 ()
sum=$[$1 + $2] #而此时的$1与$2对应的是函数体内的$1与$4
echo $sum
######## main ########
result=$(sum1 $1 $4 $2]
//此时$1会把10当作函数体内的第一个变量,接着对应着函数体外的$2为函数体内的$4,对应下面数字的10与40
echo $result
[root@localhost data]# bash demo2.sh 10 20 30 40
50
函数变量的作用范围
- 函数在Shell脚本中仅在当前Shell环境中有效(source会影响当前shell的环境)
- Shell脚本中变量默认全局有效
- 将变量限定在函数内部使用local命令(设置为局部变量)
#!/bin/bash
myfun()
echo $i
local i=9 #local命令设置为局部变量仅仅是在函数体内的有效,出了函数就无效了
echo $i
i=8
myfun
echo $i
[root@localhost data]# bash demo3.sh
8
9
8
补:两种全局变量域局部变量
Linux 全局变量 局部变量
全局变量:作用域整个操作系统所有用户的shell环境内
局部变量:变量只作用于当前shell环境内
shell脚本 全局变量 局部变量
全局变量:作用于shell脚本当前整个shell环境内,包括所有函数体内或函数体外
局部变量:作用于shell脚本当前的shell环境内,仅限制于某个函数体内
函数的递归
- 函数体内调用自己本身的函数
阶乘
#!/bin/bash
fact()
if [ $1 -eq 1 ]
then
echo 1
else
local temp=$[$1 - 1]
local result=$(fact $temp)
echo $[$1 * $result]
fi
######## main ########
read -p "请输入一个要阶乘的数值:" n
result=$(fact $n)
echo "$n的阶乘结果为:$result"
[root@localhost data]# bash demo4.sh
请输入一个要阶乘的数值:5
5的阶乘结果为:120
具体操作流程:
n=5 | fact 5 | |||
---|---|---|---|---|
fact() | $1=5 | temp=5-1=4 | result=$(fact 4) | echo 5 * $(fact 4) |
$1=4 | temp=4-1=3 | result=$(fact 3) | echo 5 4 $(fact 3) | |
$1=3 | temp=3-1=2 | result=$(fact 2) | echo 5 4 3 * $(fact 2) | |
$1=2 | temp=2-1=1 | result=$(fact 1) | echo 5 4 3 2 $(fact 1) | |
$1=1 | $(fact 1)=1 | echo 5 4 3 2 1 |
递归目录
#!/bin/bash
file_list()
for f in $(ls $1)
#遍历指定目录或者子目录的所有文件
do
if [ -d "$1/$f" ]
#$f代表目录名如果是目录则输出目录名称
then
echo "目录:$2$f"
#递归调用函数判断子目录里的文件或者目录,并且输出时进行缩进
file_list "$1/$f" " $2" #此时$2没有值;$2输出子目录与文件时进行缩进
else
#如果是子目录里的文件输出是进行缩进
echo "文件:$2$f"
fi
done
######## main ########
#递归查看指定目录相当于ls -R
#第一个位置变量用于判断是目录或者文件
#第二个位置变量用于给子目录或者文件实现位移(缩进)用的
file_list "/var/log" ""
定义函数创建库
//创建库内容
vim myfuncs.sh
#加法
jiafa()
echo $[$1 + $2]
#减法
jianfa()
echo $[$1 - $2]
#乘法
chengfa()
echo $[$1 * $2]
#除法
chufa()
if [ $2 -ne 0 ];then
echo $[$1 / $2]
else
echo "0 不能作为除数"
fi
#阶乘
fact()
if [ $1 -eq 1 ];then
echo 1
elif [ $1 -eq 0 ];then
echo 0
else
local temp=$(jianfa $1 1)
local result=$(fact $temp)
#echo $[$1 * $result]或:
echo $[chengfa $1 $result]
fi
//使用如下:
vim test.sh
. myfuncs.sh或source myfuncs.sh
v1=$1
v2=$2
result1=$(jiafa $v1 $v2)
result2=$(jianfa $v1 $v2)
result3=$(chengfa $v1 $v2)
result4=$(chufa $v1 $v2)
result5=$(fact $v1 $v2)
echo "加法结果为: $result1"
echo "减法结果为: $result2"
echo "乘法结果为: $result3"
echo "除法结果为: $result4"
echo "阶乘结果为: $result5"
以上是关于Shell编程之函数的主要内容,如果未能解决你的问题,请参考以下文章