是否可以从Unix控制台调用函数(在shell脚本中定义)?我有一个像
这样的功能add ()
{
a=$1
b=$2
c=`expr $a + $b`
}
这是在脚本"my_script.sh"
中定义的。如何从命令提示符调用此函数?
答案 0 :(得分:5)
要使用参数,请不要应用重定向运算符<
,它会将<
后面给出的文件重定向到程序的标准输入。您需要在脚本中调用函数,以便使用参数$...
,或者只需在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),区别在于第一种方法不允许嵌套调用。
如果您定义了多个函数,则可以为每个函数调用设置args,或者只是定义函数,然后使用“source script.sh”将它们加载到shell中。
由于您已经加载了这些函数,因此您需要逐个调用它们,如果已经逐个定义它们。函数中的args对应于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
或者任何参数数字都适合您的申请。
请注意,您可能会忘记vars的“语义”:这可能是由于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”。