2012-11-20 43 views
2

是否可以從Unix控制檯調用函數(在shell腳本中定義)?我有一個功能,如在Bourne Shell中調用函數

add() 
{ 
a=$1 
b=$2 
c=`expr $a + $b` 
} 

這是在腳本"my_script.sh"定義。如何從命令提示符調用此函數?

+0

我試圖從命令提示符調用此函數。我不知道使用shell命令的新命令的確切命令。我嘗試運行該文件,然後調用這個函數,如「/.my_script.sh

+0

將'源'或使用'.profile'工作? –

回答

5

要使用參數,您不應用重定向運算符<,該操作符將在<之後給出的文件重定向到程序的標準輸入。您需要在腳本中調用您的函數,才能使用參數$...,或者您可以簡單地將函數加載到您的shell中,然後使用它。

在這兩種情況下,你的函數的調用要這樣進行:

add arg1 arg2 

如果命令行,你必須加載.sh文件的內容 - 你的函數定義 - ,所以你可以從你的shell中調用它們。在這一種情況下,你的文件應該是這樣的:

#! /bin/bash 
add() {  
    a=$1 
    b=$2 
    c=$(expr $a + $b) 
    echo $c 
} 

,並會做使用該功能在你的shell執行以下操作:

source script.sh 
add 100 1000 

如果您的script.sh文件,可以使用:

./script.sh arg1 arg2 

和腳本文件的內容將是:

#! /bin/bash 
add() { 

    a=$1 
    b=$2 
    c=$(expr $a + $b) 
    echo $c 

} 
add $1 $2 

Obs:你的語法在函數定義中是無效的:你必須擁有一個表達式來分配它的評估結果;評估表達式的語法可以是cmd或$(cmd),不同之處在於第一種方法不允許嵌套調用。

如果您定義了多個函數,您可以爲每個函數調用設置參數,或者簡單地定義函數,然後使用「source script.sh」將它們加載到shell中。

由於您已經加載了函數,因此您需要調用它們以及它們是否已被逐一定義。函數中的參數對應於C中的經典「argv []」參數,它們對函數調用是唯一的。

例如,如果你想定義的添加和子功能,你必須:

#! /bin/bash 
add() { 
    a=$1 
    b=$2 
    c=$(expr $a + $b) 
    echo $c 
} 
add $1 $2 

sub() { 
    a=$1 
    b=$2 
    c=$(expr $a - $b) 
    echo $c 
} 
sub $3 $4 

或者任何參數的數字可能適合您的應用。

請注意,您可能會忽略變量的「語義」:這可能是由bash腳本的動態範圍引起的,每次執行調用時都會影響變量定義。

一個簡單的例子就是for循環。考慮所限定的附加功能如下:

add() { 
    let i=$1 + $2 
} 

而for循環被作爲執行:

for ((i = 0; i < 10; i++)); do 
    echo $i 
    add i 5 
    echo $i 
done 

的輸出是:

0 
5 
6 
11 

自變量 「i」 已經被修改,在for循環期間,不僅通過「i ++」,而且通過函數「add」,在其範圍中使用「i」。

+0

如果腳本文件具有多個功能,該怎麼辦? #! /斌/慶典 加載(){ 一個= $ 1 B = $ 2 C = $(表達式$一個+ $ b)中 回波$ C } 添加$ 1 $ 2 子(){ 一個= $ 1 b = $ 2 C = $(表達式$一個 - $ b)中 回波$ C } 子$ 1 $ 2 –

+0

@NathanPk則任一組用於每個函數調用的指定參數時,或簡單地定義函數,並將它們加載到您的shell與「源腳本.sh」。既然你已經加載了函數,你需要調用它們以及它們是否已經被逐一定義。函數內的參數對應於C語言中的經典argv參數,它們對函數調用是唯一的。 – Rubens

+1

...如果你指出,你會有:#!/bin/bash add(){a = $ 1 b = $ 2 c = $(expr $ a + $ b)echo $ c} add $ 1 $ 2 sub(){a = $ 1 b = $ 2 c = $(expr $ a - $ b)echo $ c} $ 3 $ 4(或其他適合您的應用程序的東西)。不過請注意,您可能會問這是因爲在函數中,您已經失去了變量的「語義」:這可能是由bash腳本的動態範圍引起的,每次調用都會影響變量定義執行。 – Rubens