在Bourne Shell中调用一个函数

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

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

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

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