3

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

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

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

4

1 回答 1

7

要使用参数,您不应用重定向运算符<,它将在 之后给出的文件重定向<到程序的标准输入。您需要在脚本中调用您的函数才能使用 args $...,或者您可以简单地将函数加载到 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。

由于您已经加载了函数,因此您需要调用它们以及它们是否已被一一定义。函数内部的 args 对应于 C 中经典的“argv[]”参数,它们是函数调用所独有的。

例如,如果您想定义一个 add 和一个 sub 函数,您将拥有:

#! /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

或者任何参数编号可能适合您的应用程序。

但是请注意,您可能会忘记 var 的“语义”:这可能是由 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”。

于 2012-11-21T00:02:41.720 回答