在Bourne Shell中调用函数

Nat*_* Pk 2 unix linux bash shell sh

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

add ()
{
 a=$1
 b=$2
 c=`expr $a + $b`
}
Run Code Online (Sandbox Code Playgroud)

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

Rub*_*ens 5

要使用参数,请不要应用重定向操作符<,该操作符会将文件后面给出的文件重定向<到程序的标准输入.您需要在脚本中调用函数,以便使用args $...,或者只需在shell中加载函数并使用它.

在这两种情况下,您的函数调用都是这样执行的:

add arg1 arg2
Run Code Online (Sandbox Code Playgroud)

如果通过命令行,您必须加载.sh文件的内容- 您的函数定义 - ,以便您可以从shell调用它们.在这种情况下,您的文件应如下所示:

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

并通过执行以下操作将在shell中使用该函数:

source script.sh
add 100 1000
Run Code Online (Sandbox Code Playgroud)

如果在script.sh文件中,您使用:

./script.sh arg1 arg2
Run Code Online (Sandbox Code Playgroud)

并且脚本文件的内容将是:

#! /bin/bash
add () {

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

}
add $1 $2
Run Code Online (Sandbox Code Playgroud)

Obs:你的语法在函数定义中无效:你必须拥抱一个表达式才能分配它的评估结果; 用于计算表达式的语法可以是cmd或$(cmd),区别在于第一种方法不允许嵌套调用.

如果您定义了多个函数,则可以为每个函数调用设置args,或者只是定义函数,然后使用"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
Run Code Online (Sandbox Code Playgroud)

或者任何参数数字都适合您的应用.

但请注意,您可能会忘记vars的"语义":这可能是由bash脚本的动态范围引起的,每次执行调用时都会影响变量定义.

一个直截了当的例子是for循环.考虑如下定义的add函数:

add () {
    let i=$1 + $2
}
Run Code Online (Sandbox Code Playgroud)

并且for循环执行如下:

for (( i = 0; i < 10; i++ )); do
    echo $i
    add i 5
    echo $i
done
Run Code Online (Sandbox Code Playgroud)

输出是:

0
5
6
11
Run Code Online (Sandbox Code Playgroud)

因为变量"i"已被修改,在for循环期间,不仅是"i ++",而且是"add"函数,在其范围内使用了"i".

  • 请注意`source`是特定于bash的 - 对于/ bin/sh使用`.`命令 (2认同)