zoukankan      html  css  js  c++  java
  • bash Shell中函數的應用小結(转)

    在shell編程中,很多時候都需要自定義函數.查了一些資料,對它進行了一些總結.有些列子也是摘抄過來,不為別的,只為更好理解. 
      下面是一个標準的helloworld函数的脚本(ex1.sh)示例:
      代码:
      sample()
      {
      echo "hello world!"
      }
      函数同样可以接受参数,存放第一个参数,存放第二个参数,$*存放输入参数的列表,
      Bash shell 提供位置參數來擔任參數的傳遞工作。
      例:sample2.sh p1 p2 p3 p4 p5 p6 p7 p8 p9
      其中 p1 p2 p3 p4 p5 p6 p7 p8 p9 為欲傳入 sample2.sh 這支 shell的 9 個參數,此時,用 來代表 script 本身的檔案名稱, 代表第一個參數,也就是 p1, 代表第一個參數,也就是 p2,其它依此類推。
      $# 代表參數的總數,也就是 9。
      代表這個程序的名稱,在這里就是 ”sample2.sh”
      $* 代表所有的參數,也就是 " p1 p2 p3 p4 p5 p6 p7 p8 p9"
      $@ 代表所有的參數,也就是 "p1" "p2" "p3" "p4" "p5" "p6" "p7" "p8" "p9"
      $* 和 $@ 的區別為:"$*" 代表 " p1 p2 p3 p4 p5 p6 p7 p8 p9",是將所有的參數作為一個整體字串來處理,而"$@" 代表 "p1" "p2" "p3" "p4" "p5" "p6" "p7" "p8" "p9",所有的參數還是分開的.
      shift 用來移動參數的位置,每執行一次,則所有的參數往左移一位,
      使用set可用來重新設定位置參數,比如:set a b c d,表示重新設定 為 a, 為 b, 為 c, 為 d
      例程:
      # cat sample2.sh
      exa2()
      {
      a=
      b=
      result=a+b
      echo $result
      }
      echo "Enter two numbers"
      read num1 num2
      echo -n "result is: "
      exa2 $num1 $num2
      $ sample2.sh
      Enter two numbers
      3 4
      result is:7
      函数返回值:
      使用return语句,在程序中,在调用函数之后保存返回状态$?的值.
      這樣的作法只能有一個返回值.如果想有多個返回值怎麼辦呢,我想只有使用全局變量的方法了.
      代码:
      # cat sample3.sh
      exa3()
      {
      a=
      b=
      result=a+b
      return $result
      }
      echo "Enter two numbers"
      read num1 num2
      exa3 $num1 $num2
      answer=$?
      echo "$num1 to $num2 is $answer"
      shell函數也可以递归調用,目前還不太清楚递归調用的層級限制,可能和c一樣吧.:
      代码: 
      power()
      {
      x=
      y=
      if [ $y -eq 1 ]
      then
      return $x
      else
      y=`expr $y - 1`
      power $x $y
      result=`expr $? \* $x`
      return $result
      fi
      }
      echo "Enter two numbers"
      read num1 num2
      power $num1 $num2
      answer=$?
      echo "$num1 to $num2 is $answer"
      默认情况下,所有函数的变量都是全局变量.你可以用typeset去声明一个局部变量:
      代码:
      easy()
      {
      typeset a
      a=`expr + `
      b=`expr + `
      echo "easy a is " $a
      echo "easy b is " $b
      }
      a=10
      b=20
      easy $a $b
      echo "global a is " $a
      echo "global b is " $b
      Output:
      easy a is 30
      easy b is 30
      global a is 10
      global b is 30
      如果要在脚本中多次使用函数,可以把它放在一个函数目录中,像一个普通文件一样,使用的时候把它放在脚本开始的地方:
      . functionfile
      #cat sm1.sh
      sam1()
      {
      a=
      b=
      if [ $b -eq 1 ]
      then
      return $a
      else
      b=`expr $b - 1`
      sam1 $a $b
      result=`expr $? \* $a`
      return $result
      fi
      }
      #cat sm2.sh
      . sm1.sh
      echo –n "Enter two numbers:"
      read a b
      sam1 $a $b
      result=$?
      echo "Answer is:" $result
      運行sm2.sh
      $ sh sm2.sh
      Enter two numbers:2 5
      Answer is: 32
    aliyun活动 https://www.aliyun.com/acts/limit-buy?userCode=re2o7acl
  • 相关阅读:
    FFC详解及应用
    getBoundingClientRect
    userAgent
    各种排序算法的分析及java实现
    解读TCP 四种定时器
    TCP那些事儿(下)
    TCP那些事儿(上)
    10个实用的 Linux 网络和监控命令[转]
    监控 Linux 性能的 18 个命令行工具[转]
    4个强大的Linux服务器监控工具[转]
  • 原文地址:https://www.cnblogs.com/wangbin/p/1539456.html
Copyright © 2011-2022 走看看