[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

 

本节结束

 

posted @ 2020-05-25 16:31  workingdiary  阅读(672)  评论(0)    收藏  举报