[Linux Shell学习系列八]Shell函数-1函数的定义+2函数的参数变量与返回值
D15
Shell函数是Shell脚本中由命令集和语句组成的代码块,这个代码块可以被其他脚本或是脚本中的其他部分所调用,所以Shell函数可以使程序模块化,即把代码分隔成独立的任务块。这样,可以重用代码块。
1. 函数的定义
语法:
#函数名 [function] function_name() #写不写function关键字取决于用户习惯,如果写了function可以不用() { #函数体,在函数中执行的命令行 commands... #参数返回,return语句是可选的, #如果没有,则以函数最后一条命令的运算结果作为返回值 #如果使用return,则返回数值n [ return [n]; ] } #也可以在一行内定义一个函数,各命令行需要用;隔开 function function_name { command1; command2; ... commandN; } #或者 function_name() { command1; command2; ... commandN; }
可以使用内部命令unset的-f选项来取消函数的定义。
$ fun_a() { echo "This is function a."; } #定义
$ fun_a #执行
This is function a.
$ unset -f fun_a #取消定义
$ fun_a #尝试失败
-bash: fun_a: command not found
2. 函数的参数、变量与返回值
1)向函数传递参数
Shell函数有自己的命令行参数,使用特殊变量$1,$2...$n(位置参数)来访问传递给它的参数。
函数定义语法:
function_name(){ arg1=$1 arg2=$2 command on $arg1 }
调用参数语法:
function_name input1 input2
这里:
function_name是函数名;
input1是参数1,即传递给函数的第一个参数$1;
input2是参数2,即传递给函数的第二个参数$2。
示例:
$ cat args.sh #!/bin/bash #20200525 passed(){ a=$1 echo "passed(): \$0 is $0" #打印第0个参数,即脚本名称 echo "passed(): \$1 is $1" #打印第1个参数,即输入的第一个数据 echo "passed(): \$a is $a" #打印赋值给a的数据,即第1个参数 echo "passed(): total args $#" #打印参数个数 echo "passed(): all args(\$@) - \"$@\"" #打印所有参数 echo "passed(): all args(\$*) - \"$*\"" #打印所有参数 } echo "###########calling passed No.1#############" #第一次调用函数,输入一个参数 passed one echo "###########calling passed No.2#############" #第二次调用函数,输入三个参数 passed one two three #执行 $ ./args.sh ###########calling passed No.1############# passed(): $0 is ./args.sh passed(): $1 is one passed(): $a is one passed(): total args 1 passed(): all args($@) - "one" passed(): all args($*) - "one" ###########calling passed No.2############# passed(): $0 is ./args.sh passed(): $1 is one passed(): $a is one passed(): total args 3 passed(): all args($@) - "one two three" passed(): all args($*) - "one two three"
2)本地变量
默认情况下脚本中的所有的变量都是全局的,在函数中修改一个变量将改变这个脚本中此变量的值,可能产生问题。
可以使用local命令来创建一个本地变量。
语法:
local var=value
local varName
function_name(){
local var=$1
command on $var
}
注意:
local命令只能在函数内部使用;
local命令将变量名的可见范围限制在函数内部。
示例$ cat localarg.sh
#!/bin/bash #20200525 a="normal_a" #外部变量a funca() { local a=$1; echo "local arg a is: $a."; } #funca中的变量a定义为local echo "a before calling funca: $a" funca func_a #调用funca,设置了local变量a的值 echo "a after calling funca: $a" b="normal_b" #外部变量b funcb() { b=$1; echo "arg b is $b."; } #funcb中的变量为普通变量 echo "b before calling funcb: $b"
funcb func_b #调用funcb,设置了变量b的值 echo "b after calling funcb: $b" #执行 $ ./localarg.sh a before calling funca: normal_a local arg a is: func_a. #funca中的local变量a是调用函数时的取值 a after calling funca: normal_a #外部变量a的值没有被修改 b before calling funcb: normal_b arg b is func_b. b after calling funcb: func_b #外部变量b的值被修改了
3)return命令
示例:
$ cat return.sh #!/bin/bash #20200525 checkpid() { local i for i in $* do [ -d "/proc/$i" ] && return 0 #如果进程文件夹存在,则返回0 done return 1 #否则返回1 } echo "#########checkpid of existing proc############" checkpid 24249 #存在的进程,返回0 echo $? echo "#########checkpid of none proc############" checkpid 4444 #不存在,返回1 echo $? #执行 $ ./return.sh #########checkpid of existing proc############ 0 #########checkpid of none proc############ 1
4)函数返回值测试
采用$?得到最近一次执行的前台命令的退出状态。
echo "#########checkpid of several procs########" checkpid $pid1 $pid2 $pid3 if [ $? = 0 ] #判断执行结果 then echo "One of these is running!" else echo "None is running!" fi
本节结束
欢迎大家评论交流,发现博文中存在的问题一定要留言哦

浙公网安备 33010602011771号