我想问一下关于将参数传递给函数的问题。我试过这个:
function_name $var1 $var2
但通常(有时会打印错误)我是否传递它们都没有什么区别。我的意思是当我只用 调用它时它就能完美地工作function_name
。所以我的问题是:是否有必要像上面的例子那样给出这些参数?
答案1
Bash 不检查传递给函数的参数数量,因为没有 C 中的原型。https://www.gnu.org/software/bash/manual/bash.html#Shell-Functions:
Shell 函数是一种对命令进行分组以便稍后使用组的单个名称执行的方法。它们的执行方式就像“常规”命令一样。当 shell 函数的名称用作简单命令名称时,将执行与该函数名称关联的命令列表。 Shell 函数在当前 shell 上下文中执行;没有创建新的流程来解释它们。
使用以下语法声明函数:
name () 复合命令 [ 重定向 ]
或者
函数名 [()] 复合命令 [ 重定向 ]
一种方法是在函数内部检查多个参数是否正确,如果不正确则返回错误,但这不是 Bash 的责任。看:
#!/bin/bash
function f()
{
echo $1
}
function f1
{
echo $1
}
f
f 2
f1
f1 f1
答案2
您可以按照调用函数时在命令行上出现的顺序将函数的参数引用为编号扩展。如果您希望要求存在参数才能使函数运行,您可以通过参数扩展对相关参数进行内在的失败引用来实现这一点。
echo1()(
printf %s\\n \
"${1?This function requires an argument!}"
)
上面将打印该值(如果有的话)对于函数的第一个参数,后跟 stdout 的换行符并返回 0,否则它将以 shell 的格式打印一条包含短语的诊断消息这个函数需要一个参数!到 stderr 并返回非 0(如果根本没有提供任何参数)。
请注意,该函数被声明为在子 shell 中运行,例如:
fn()( : body )
而不是在当前的 shell 中,例如:
fn(){ : body; }
这是因为用于引发错误的参数替换形式会导致当前 shell 退出 - 如果该函数在当前 shell 中运行,则可能会导致当前 shell 意外退出。这仅适用于非交互式然而,贝壳。例如,无论该函数是否在子 shell 中声明,如果从提示符调用,上述函数的行为都应该类似。
echo1
但是,如果该函数是在当前 shell 中声明并在脚本中执行的,那么如果在不带任何参数的情况下调用该脚本,该脚本将整体退出执行。
答案3
函数就像外部命令一样,接收参数列表。无法定义本质上需要一定数量参数的函数。该函数的代码可以检查参数的数量及其值,并根据需要发出错误消息。
传递给当前函数的参数数量在特殊变量中可用$#
。如果您使用的编号参数大于实际参数的数量,则该参数将被取消设置,因此如果您尝试访问它,您将得到一个空字符串。例如,具有以下定义:
f () {
echo "$#" "[[$2]]"
}
f
印刷0 [[]]
。由于没有参数号 2,因此$2
扩展为空字符串。f one
打印1 [[]]
,出于同样的原因。f one two
印刷2 [[two]]
。f one two three
印刷3 [[two]]
。该函数碰巧没有对其第三个参数执行任何操作,但这没关系。