在Bourne Shell中调用函数

时间:2012-11-20 23:44:42

标签: linux bash shell unix sh

是否可以从Unix控制台调用函数(在shell脚本中定义)?我有一个像

这样的功能
add ()
{
 a=$1
 b=$2
 c=`expr $a + $b`
}

这是在脚本"my_script.sh"中定义的。如何从命令提示符调用此函数?

1 个答案:

答案 0 :(得分: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),区别在于第一种方法不允许嵌套调用。

如果您定义了多个函数,则可以为每个函数调用设置args,或者只是定义函数,然后使用“source script.sh”将它们加载到shell中。

由于您已经加载了这些函数,因此您需要逐个调用它们,如果已经逐个定义它们。函数中的args对应于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

或者任何参数数字都适合您的申请。

请注意,您可能会忘记vars的“语义”:这可能是由于bash脚本的动态范围造成的,每次执行调用时都会影响变量定义。

一个简单的例子是for循环。考虑如下定义的add函数:

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”。