美文网首页
Linux 命令 & shell 脚本之09(函数)

Linux 命令 & shell 脚本之09(函数)

作者: 轻飘飘D | 来源:发表于2020-10-19 23:19 被阅读0次

    1.使用函数

    [oracle@XAG143 myshell]$ cat test_fun1.sh 
    #!/bin/bash 
    # using a function in a script 
    function func1 
    { 
     echo "This is an example of a function" 
    } 
    count=1 
    while [ $count -le 3 ] 
    do 
     func1 
     count=$[ $count + 1 ] 
    done 
    echo "This is the end of the loop" 
    func1 
    echo "Now this is the end of the script" 
    
    [oracle@XAG143 myshell]$ ./test_fun1.sh 
    This is an example of a function
    This is an example of a function
    This is an example of a function
    This is the end of the loop
    This is an example of a function
    Now this is the end of the script
    

    2.函数返回值(默认退出状态码)

    默认情况下,函数的退出状态码是函数中最后一条命令返回的退出状态码。
    在函数执行结束后,可以用标准变量$?来确定函数的退出状态码
    $ cat test4.sh 
    #!/bin/bash 
    # testing the exit status of a function 
    func1() { 
     echo "trying to display a non-existent file" 
     ls -l badfile 
    } 
    echo "testing the function: " 
    func1 
    echo "The exit status is: $?" 
    
    $ ./test4.sh
    testing the function: 
    trying to display a non-existent file 
    ls: badfile: No such file or directory 
    The exit status is: 1
    #函数的退出状态码是1,这是因为函数中的最后一条命令没有成功运行。但你无法知道函数中其他命令中是否成功运行
    使用函数的默认退出状态码是很危险的
    

    3.函数返回值(使用 return 命令)

    $ cat test5.sh 
    #!/bin/bash 
    # using the return command in a function 
    function dbl { 
     read -p "Enter a value: " value 
     echo "doubling the value" 
     return $[ $value * 2 ] 
    } 
    dbl 
    echo "The new value is $?"
    
    $ ./test5.sh 
    Enter a value: 2 
    doubling the value 
    The new value is 2
    
    $ ./test5.sh 
    Enter a value: 200 
    doubling the value 
    The new value is 1
     记住,函数一结束就取返回值;
     记住,退出状态码必须是0~255。
    要返回较大的整数值或者字符串值的话,你就不能用这种返回值的方法了
    

    4.函数返回值(使用函数输出)

    会用echo语句来显示计算的结果
    
    $ cat test5b.sh 
    #!/bin/bash 
    # using the echo to return a value 
    function dbl { 
     read -p "Enter a value: " value 
     echo $[ $value * 2 ] 
    } 
    result=$(dbl) 
    echo "The new value is $result" 
    
    $ ./test5b.sh 
    Enter a value: 200 
    The new value is 400
    
    你会注意到dbl函数实际上输出了两条消息。read命令输出了一条简短的消息来向用户询问输入值。
    bash shell脚本非常聪明,并不将其作为STDOUT输出的一部分,并且忽略掉它。
    如果你用echo语句生成这条消息来向用户查询,那么它会与输出值一起被读进shell变量中。
    

    5.向函数传递参数

    函数名会在$0
    变量中定义,函数命令行上的任何参数都会通过$1、$2等定义。也可以用特殊变量$#来判断传给函数的参数数目
    
    [oracle@XAG143 myshell]$ cat test_fun6.sh 
    #!/bin/bash 
    # passing parameters to a function 
    function addem 
    { 
     if [ $# -eq 0 ] || [ $# -gt 2 ]; then 
       echo -1 
     elif [ $# -eq 1 ]; then 
       echo $[ $1 + $1 ] 
     else 
       echo $[ $1 + $2 ] 
     fi
    } 
    echo -n "Adding 10 and 15: " 
    value=$(addem 10 15) 
    echo $value 
    echo -n "Let's try adding just one number: " 
    value=$(addem 10) 
    echo $value 
    echo -n "Now trying adding no numbers: " 
    value=$(addem) 
    echo $value 
    echo -n "Finally, try adding three numbers: " 
    value=$(addem 10 15 20) 
    echo $value
    
    [oracle@XAG143 myshell]$ ./test_fun6.sh 
    Adding 10 and 15: 25
    Let's try adding just one number: 20
    Now trying adding no numbers: -1
    Finally, try adding three numbers: -1
    

    6.获取脚本在命令行中的参数值

    [oracle@XAG143 myshell]$ cat test_fun7.sh 
    #!/bin/bash 
    # trying to access script parameters inside a function 
    function func7 
    { 
     echo $[ $1 * $2 ] 
    } 
    if [ $# -eq 2 ]; then 
     value=$(func7 $1 $2) 
     echo "The result is $value" 
    else 
     echo "Usage: badtest1 a b" 
    fi
    
    [oracle@XAG143 myshell]$ ./test_fun7.sh 4 5
    The result is 20
    

    8.函数中局部变量

    只要在变量声明的前面加上local关键字就可以了
    [oracle@XAG143 myshell]$ cat test_fun8.sh 
    #!/bin/bash 
    # trying to access script parameters inside a function 
    function func7 
    { 
      local temp=$[ $1 * $2 ] 
      echo $[ $temp * 2 ]
    } 
    if [ $# -eq 2 ]; then 
     value=$(func7 $1 $2) 
     echo "The result is $value" 
    else 
     echo "Usage: badtest1 a b" 
    fi
    
    [oracle@XAG143 myshell]$ ./test_fun8.sh 4 5
    The result is 40
    

    9.向函数传数组参数

    [oracle@XAG143 myshell]$ cat test_fun10.sh
    #!/bin/bash 
    # array variable to function test 
    function testit 
    {
      local newarray 
      #newarray=$1 
      # or
      newarray=($(echo "$@"))
      echo "The new array value is: ${newarray[*]}" 
    
      for var in ${newarray[@]}; do
        echo "打印的内容@:" $var 
      done
    
     for var2 in ${newarray[*]}; do
       echo "打印的内容*:" $var2 
     done
    } 
    myarray=(1 2 3) 
    echo "The original array is ${myarray[*]}" 
    testit "${myarray[*]}"
    
    [oracle@XAG143 myshell]$ ./test_fun10.sh 
    The original array is 1 2 3
    The new array value is: 1 2 3
    打印的内容@: 1
    打印的内容@: 2
    打印的内容@: 3
    打印的内容*: 1
    打印的内容*: 2
    打印的内容*: 3
    
    方法2
    [oracle@XAG143 myshell]$ cat test_fun10.sh
    #!/bin/bash 
    # array variable to function test 
    function testit 
    {
      local newarray 
      newarray=($(echo "$@"))
      echo "The new array value is: ${newarray[*]}" 
    
      for var in ${newarray[@]}; do
        echo "打印的内容@:" $var 
      done
    
     for var2 in ${newarray[*]}; do
       echo "打印的内容*:" $var2 
     done
    } 
    myarray=(1 2 3) 
    echo "The original array is ${myarray[*]}" 
    #testit "${myarray[*]}"
    # or
    arg1=$(echo ${myarray[*]})
    testit $arg1
    
    [oracle@XAG143 myshell]$ ./test_fun10.sh 
    The original array is 1 2 3
    The new array value is: 1 2 3
    打印的内容@: 1
    打印的内容@: 2
    打印的内容@: 3
    打印的内容*: 1
    打印的内容*: 2
    打印的内容*: 3
    

    10.从函数返回数组

    [oracle@XAG143 myshell]$ cat test_fun11.sh
    #!/bin/bash 
    # returning an array value 
    function f_double 
    { 
     local origarray 
     local newarray 
     local elements 
     local i 
     origarray=($(echo "$@")) 
     newarray=($(echo "$@")) 
     elements=$[ $# - 1 ] 
     for (( i = 0; i <= $elements; i++ )) 
     { 
       newarray[$i]=$[ ${origarray[$i]} * 2 ] 
     } 
     echo ${newarray[*]} 
    } 
    myarray=(1 2 3) 
    echo "The original array is: ${myarray[*]}" 
    arg1=$(echo ${myarray[*]}) 
    result=($(f_double $arg1)) 
    echo "The new array is: ${result[*]}"
    
    [oracle@XAG143 myshell]$ ./test_fun11.sh 
    The original array is: 1 2 3
    The new array is: 2 4 6
    

    11.创建函數库

    [oracle@DB02 myshell]$ cat myfuns.sh 
    # my script functions 
    function addem 
    { 
     echo $[ $1 + $2 ] 
    } 
    function multem 
    { 
     echo $[ $1 * $2 ] 
    } 
    
    [oracle@DB02 myshell]$ cat test_call_myfuns.sh 
    #!/bin/bash 
    # using functions defined in a library file 
    #. ./myfuns.sh
    # or
    source ./myfuns.sh 
    value1=10 
    value2=5 
    result1=$(addem $value1 $value2) 
    result2=$(multem $value1 $value2) 
    echo "The result of adding them is: $result1" 
    echo "The result of multiplying them is: $result2" 
    
    [oracle@DB02 myshell]$ chmod u+x test_call_myfuns.sh 
    
    [oracle@DB02 myshell]$ ./test_call_myfuns.sh 
    The result of adding them is: 15
    The result of multiplying them is: 50
    

    12.下载、安装、使用GNU shtool shell脚本函数库

    [root@DB02 ~]# cd /usr/local/src
    [root@DB02 src]# pwd
    /usr/local/src
    [root@DB02 src]# wget ftp://ftp.gnu.org/gnu/shtool/shtool-2.0.8.tar.gz
    
    [root@DB02 src]# ls
    shtool-2.0.8.tar.gz
    
    使用tar命令提取文件。
    [root@DB02 src]# tar -zxvf shtool-2.0.8.tar.gz
    [root@DB02 src]# ls
    shtool-2.0.8  shtool-2.0.8.tar.gz
    
    构建库
    [root@DB02 src]# cd shtool-2.0.8
    [root@DB02 shtool-2.0.8]# ./configure
    [root@DB02 shtool-2.0.8]# make
    
    使用make命令测试这个库文件
    [root@DB02 shtool-2.0.8]#  make test
    Running test suite:
    echo...........ok
    mdate..........ok
    table..........ok
    prop...........ok
    move...........ok
    install........ok
    mkdir..........ok
    mkln...........ok
    mkshadow.......ok
    fixperm........ok
    rotate.........ok
    tarball........ok
    subst..........ok
    platform.......ok
    arx............ok
    slo............ok
    scpp...........ok
    version........ok
    path...........ok
    OK: passed: 19/19
    
    安装,需要使用make命令的install选项。不过你得以root用户的身份运行该命令
    [root@DB02 shtool-2.0.8]# make install
    ./shtool mkdir -f -p -m 755 /usr/local
    ./shtool mkdir -f -p -m 755 /usr/local/bin
    ./shtool mkdir -f -p -m 755 /usr/local/share/man/man1
     ...
    ./shtool install -c -m 644 sh.version /usr/local/share/shtool/sh.version
    ./shtool install -c -m 644 sh.path /usr/local/share/shtool/sh.path
    
    shtool 库函数
    shtool库提供了大量方便的、可用于shell脚本的函数。如下列出了库中可用的函数。
    ---------------------------------------------------
    函 数     描 述
    Arx       创建归档文件(包含一些扩展功能)
    Echo      显示字符串,并提供了一些扩展构件
    fixperm   改变目录树中的文件权限
    install   安装脚本或文件
    mdate     显示文件或目录的修改时间
    mkdir     创建一个或更多目录
    Mkln      使用相对路径创建链接
    mkshadow  创建一棵阴影树
    move      带有替换功能的文件移动
    Path      处理程序路径
    platform  显示平台标识
    Prop      显示一个带有动画效果的进度条
    rotate    转置日志文件
    Scpp      共享的C预处理器
    Slo       根据库的类别,分离链接器选项
    Subst     使用sed的替换操作
    Table     以表格的形式显示由字段分隔(field-separated)的数据
    tarball   从文件和目录中创建tar文件
    version   创建版本信息文件
    --------------------------------------------------------
    每个shtool函数都包含大量的选项和参数,你可以利用它们改变函数的工作方式。下面是shtool函数的使用格式:
    shtool [options] [function [options] [args]]
    

    13.使用库shtool

    [oracle@DB02 myshell]$ cat test_shtool.sh 
    #!/bin/bash 
    shtool platform
    
    [oracle@DB02 myshell]$ ./test_shtool.sh 
    centos 6.5 (AMD64)
    
    查看幫助
    [oracle@DB02 myshell]$ shtool -h
    

    相关文章

      网友评论

          本文标题:Linux 命令 & shell 脚本之09(函数)

          本文链接:https://www.haomeiwen.com/subject/gkzlmktx.html