1. 程式人生 > >shell指令碼之函式

shell指令碼之函式

1.Shell 函式有兩種語法形式:

function name {
    commands
    return
}
and
name () {
    commands
    return
}

這裡的 name 是函式名,commands 是一系列包含在函式中的命令。

兩種形式是等價的,可以交替使用。下面我們將檢視一個說明 shell 函式使用方法的指令碼:

1     #!/bin/bash
2
3     # Shell function demo
4
5     function funct {
6       echo "Step 2"
7       return
8     }
9
10     # Main program starts here
11
12     echo "Step 1"
13     funct
14     echo "Step 3"
輸出:

step1

step2

step3

補充1:想讓函式fsum返回字串,可以echo "${a}+${b}=${c}"輸出出來,通過sum=`fsum`來捕獲,給變數sum賦值

your_name='qinjx'
str="Hello, I know your are \"${your_name}aa\"! \n"
echo ${str}
function fsum(){
        a=1
        b=2
        c=3
        echo "${a}+${b}=${c}"
}
sum=`fsum`
echo ${sum}

your_name='qinjx'
str="Hello, I know your are \"${your_name}aa\"! \n"
echo ${str}
function fsum(){
        a=1
        b=2
        c=3
        echo "${a}+${b}=${c}"
}
sum=`fsum`
echo ${sum}

補充二:想讓函式fsum返回字串,可以給一個全域性變數賦值

your_name='qinjx'
str="Hello, I know your are \"${your_name}aa\"! \n"//全域性變數str
echo ${str}
function fsum(){
        a=1
        b=2
        c=3
        str="${a}+${b}=${c}"
}
fsum
echo ${str}

補充三,函式返回整形值,只能通過$? 系統變數獲得,否則為空

function fSum() { echo $1,$2; return
 $(($1+$2)); } fSum 5 7; total=$(fSum 3 2); echo $total,$?; 5,7 3,2 5

2.區域性變數

區域性變數只能在定義它們的 shell 函式中使用,並且一旦 shell 函式執行完畢,它們就不存在了。

擁有區域性變數允許程式設計師使用的區域性變數名,可以與已存在的變數名相同,這些變數可以是全域性變數, 或者是其它 shell 函式中的區域性變數,卻不必擔心潛在的名字衝突。

這裡有一個例項指令碼,其說明了怎樣來定義和使用區域性變數:

#!/bin/bash
# local-vars: script to demonstrate local variables
foo=0 # global variable foo
funct_1 () {
    local foo  # variable foo local to funct_1
    foo=1
    echo "funct_1: foo = $foo"
}
funct_2 () {
    local foo  # variable foo local to funct_2
    foo=2
    echo "funct_2: foo = $foo"
}
echo "global:  foo = $foo"
funct_1
echo "global: foo = $foo"
funct_2
echo "global: foo = $foo"

正如我們所看到的,通過在變數名之前加上單詞 local,來定義區域性變數。這就建立了一個只對其所在的 shell 函式起作用的變數。在這個 shell 函式之外,這個變數不再存在。當我們執行這個指令碼的時候, 我們會看到這樣的結果:

[[email protected] ~]$ local-vars
global:  foo = 0
funct_1: foo = 1
global:  foo = 0
funct_2: foo = 2
global:  foo = 0

我們看到對兩個 shell 函式中的區域性變數 foo 賦值,不會影響到在函式之外定義的變數 foo 的值。

這個功能就允許 shell 函式能保持各自以及與它們所在指令碼之間的獨立性。這個非常有價值,因為它幫忙 阻止了程式各部分之間的相互干涉。這樣 shell 函式也可以移植。也就是說,按照需求, shell 函式可以在指令碼之間進行剪下和貼上。


3.你的 .bashrc 檔案中的 shell 函式

Shell 函式完美地替代了別名,並且實際上是建立個人所用的小命令的首選方法。別名 非常侷限於命令的種類和它們支援的 shell 功能,然而 shell 函式允許任何可以編寫指令碼的東西。 例如,如果我們喜歡 為我們的指令碼開發的這個 report_disk_space shell 函式,我們可以為我們的 .bashrc 檔案 建立一個相似的名為 ds 的函式:

ds () {
  echo “Disk Space Utilization For $HOSTNAME”
  df -h
}