zoukankan      html  css  js  c++  java
  • shell函数

    shell编程里面一直没怎么使用函数,都是用命令,需要写到递归,用函数处理一下,顺带学习一下,做个记录。

    参考   Linux&shell 之高级 Shell 脚本编程 - 创建函数

    使用函数

    #!/bin/bash
    # testing the script
    function myfun {
      echo "This is an example of a function"
    }
    count=1
    while [ $count -le 5 ]
    do
      myfun
      count=$[ $count +1 ]
    done
    echo "This is the end of the loop"
    myfun
    echo "Now this is the end of the script"

    (记得空格,函数一定要在使用之前定义,函数名必须唯一)

    返回值
    可以通过 $? 来确定函数的退出状态

    使用 return 命令

    #!/bin/bash
    # testing the script
    function myfun {
      read -p "Enter a value:" value
      echo "double the value"
      return $[ $value * 2 ]
    }
    myfun
    echo "The new vlue is $?" 

    结果:
    Enter a value:23
    double the value
    The new vlue is 46
    (退出状态的取值范围是 0 到 255,$? 是最近已执行命令的退出状态)

    使用函数输出

    这种方法最靠谱了
    看例子

    #!/bin/bash
    # testing the script
    function myfun {
      read -p "Enter a value:" value
      echo $[ $value * 2 ]
    }
    result=`myfun`
    echo "The new vlue is $result"

    (这样就能很好的利用输出结果了)

    在函数中使用变量

    向函数传递参数

    #!/bin/bash
    # testing the script
    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 "Just one number 10:"
    value=`addem 10`
    echo $value
    echo -n "No numbers:"
    value=`addem`
    echo $value
    echo -n "More than two numbers:"
    vaule=`addem 10 15 20`
    echo $value

    结果:
    Adding 10 and 15:25
    Just one number 10:20
    No numbers:-1
    (由上述可知,# 可以得到参数的个数,1 表示第一个参数,$2 表示第二个参数)

    #!/bin/bash
    # testing the script
    function addem {
      if [ $# -eq 0 ]||[ $# -gt 2 ]
      then
        echo -1
      elif [ $# -eq 1 ]
      then
        echo $[ $1 + $1 ]
      else
        echo $[ $1 + $2 ]
      fi
    }
    if [ $# -eq 2 ]
    then
      value=`addem $1 $2`
      echo "The value is $value"
    else
      echo "Usage:test1 a b"
    fi

    (函数外面的 # 表示调用脚本使用的参数数,函数里的# 表示调用脚本使用的参数数,函数里的# 表示调用函数使用的参数数,注意这点区别)


    作用域是变量的可见区域。

    全局变量

    在 shell 脚本内处处有效的变量。函数中定义全局变量,那么主代码中有效。主代码中定义全局,函数中也有效。
    默认情况下,脚本中定义的变量都是全局变量。
    看例子:

    #!/bin/bash
    # testing the script
    function myfun {
      value=$[ $value * 2 ]
    }
    read -p "Enter a value:" value
    myfun
    echo "The new value is:$value"

    (输入 45,得到 90,这里的 value 在函数中发生变化了,到脚本中一样可以使用,而且已经变化了)

    局部变量

    作用范围只在函数当中
    关键字 local

    #!/bin/bash
    # testing the script
    function myfun {
      local value=$[ $value * 2 ]
    }
    read -p "Enter a value:" value
    myfun
    echo "The new value is:$value"

    (输入 45,输出 45。因为加上 local 关键字之后,函数中的 value 是局部变量,与外界无关)

    #!/bin/bash
    # testing the script
    function myfun {
      local value=$[ $value * 2 ]
      echo $value
    }
    read -p "Enter a value:" value
    result=`myfun`
    echo "The new value is:$value"
    echo "The result of the fun is $result"

    (不过可以通过输出来获取函数处理的结果,这里的 result 还是处理后的结果,比如输入 45,处理后是 90)

    数组变量与函数

    #!/bin/bash
    # testing the script
    function addarray {
      local sum=0
      local newarray
      newarray=(`echo "$@"`)
      for value in ${newarray[*]}
      do
        sum=$[ $sum + $value ]
      done
      echo $sum
    }
    myarray=(1 2 3 4 5)
    echo "The original array is :${myarray[*]}"
    arg=`echo ${myarray[*]}`
    result=`addarray $arg`
    echo "The result is $result"

    结果:
    The original array is :1 2 3 4 5
    The result is 15
    (数组参数传入函数,函数获取后,进行处理输出。脚本将输出结果打印)

    #!/bin/bash
    # testing the script
    function addarray {
      local sum=0
      local newarray
      newarray=(`echo "$@"`)
      for value in ${newarray[*]}
      do
        sum=$[ $sum + $value ]
      done
      echo ${newarray[*]}
    }
    myarray=(1 2 3 4 5)
    echo "The original array is :${myarray[*]}"
    arg=`echo ${myarray[*]}`
    result=`addarray $arg`
    echo "The result is $result"

    (输出数组)

    函数递归

    #!/bin/bash
    # testing the script
    function factorial {
      if [ $1 -eq 1 ]
      then
        echo 1
      else
        local temp=$[ $1 -1 ]
        local result=`factorial $temp`
        echo $[ $result * $1 ]
      fi
    }
    read -p "Enter value:" value
    result=`factorial $value`
    echo "The factorial of $value is:$result"

    (输入 5,输出 120。大环套小环,小环套更小,逐步执行。
    我们一步一步剖析
    5 输入得到 5*4!
    4 又得到 4*3!
    3 又得到 3*2!
    2 又得到 2*1
    由此得到 5*4*3*2*1 也就是 120


    显然单个脚本有助于减少输入量,但是如果多个脚本碰巧使用同样的函数又该怎样?

    创建库

    #my script functions
    function addem {
      echo $[ $1 + $2 ]
    }
    function multem {
      echo $[ $1 * $2 ]
    }
    function divem {
      if [ $2 -ne 0 ]
      then
        echo $[ $1 / $2 ]
      else
        echo -1
      fi
    }

    使用函数库的关键词是 source

    #!/bin/bash
    # testing the script
    source ./myfuncs
    
    result=`addem 10 15`
    echo "The result is $result"

    (通过 source 就能使用库函数了)

    #!/bin/bash
    # testing the script
    . ./myfuncs
    
    result=`addem 10 15`
    echo "The result is $result"

    (或者点操作符,效果是一样的)

    在命令行中使用函数

    [root@localhost shellscript]# function multem {
    > echo [[1 * $2]
    > }
    [root@localhost shellscript]# multem 2 5
    10

    (多行命令)

    在. bashrc 文件中定义函数

    直接在命令行定义 shell 函数的缺点是一旦退出 shell,函数定义将失效。
    比较省事的方法是将函数定义在 shell 每次启动都能重新载入的地方。.bashrc 文件就是这样的地方。
    可以用 source(点操作符)将现有库文件的函数包含进. bashrc 脚本。
    重新启动命令(source .bashrc)

    # .bashrc
    # Source global definitions
    if [-f /etc/bashrc]; then
            . /etc/bashrc
    fi
    # User specific aliases and functions
    function addem {
      echo [[1 + $2]
    }

    (重启之后,新加入的函数就有效了)
    脚本中也可以使用了

     
  • 相关阅读:
    cookie小结
    WEB服务器,TOMCAT和servlet之间的关系
    HTTP协议基础总结
    servlet总结
    注解总结
    常使用的String方法
    变量&&常量
    标识符&&注释&&关键字
    配置环境变量&&OpenJDK和OracleJDK区别
    逆向工程__Generate插件安装 && xml配置文件解析 &&使用反向生成代码 && 接口说明
  • 原文地址:https://www.cnblogs.com/dahu-daqing/p/8191823.html
Copyright © 2011-2022 走看看