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]
    }

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

     
  • 相关阅读:
    背水一战 Windows 10 (61)
    背水一战 Windows 10 (60)
    背水一战 Windows 10 (59)
    背水一战 Windows 10 (58)
    背水一战 Windows 10 (57)
    背水一战 Windows 10 (56)
    背水一战 Windows 10 (55)
    背水一战 Windows 10 (54)
    背水一战 Windows 10 (53)
    背水一战 Windows 10 (52)
  • 原文地址:https://www.cnblogs.com/dahu-daqing/p/8191823.html
Copyright © 2011-2022 走看看