是否可以从 Unix 控制台调用函数(在 shell 脚本中定义)?我有一个像
add ()
{
a=$1
b=$2
c=`expr $a + $b`
}
这是在脚本中定义的"my_script.sh"
。如何从命令提示符调用此函数?
要使用参数,您不应用重定向运算符<
,它将在 之后给出的文件重定向<
到程序的标准输入。您需要在脚本中调用您的函数才能使用 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”。