linux - 在 Bourne Shell 中调用函数

标签 linux bash shell unix sh

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

这样的功能
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

观察:您的语法在函数定义中无效:您必须包含一个表达式才能分配其评估结果;评估表达式的语法可以是 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 () {
    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”。

关于linux - 在 Bourne Shell 中调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13484160/

相关文章:

linux - 如何以 pythanic 方式加载所有配置文件?

linux - 在httpd.conf中收集网站并获取文件夹大小的脚本

bash - 为文件夹中的所有目录创建一个子目录

java - 如何在cygwin中快速切换JDK?

linux - 带有操作符后跟管道的 Shell 命令

linux - 如何在 Rust 中创建虚拟文件系统?

linux - 如何使用 BASH 比较两个文本文件的相同文本?

c - Linux内核:why not put device as the first member of platform_device struct

linux - AWK解释 awk -F'AUTO_INCREMENT =' ' NF==1{print "0";next}{sub(/.*/,"",$2);print $2}'

linux - "ls"在 cmd 行中工作,但在名称中有空格的目录的脚本中不工作