首页 > 解决方案 > 如何区分函数参数和脚本参数

问题描述

假设我有一个名为 hello 的脚本

$ cat hello
function1 () {
echo $1
}
function1 what
echo $1

我打电话给

$ sh hello chicken
what
chicken

我如何引用函数内部的脚本参数(鸡)。我是否必须重命名所有脚本参数或将它们存储在其他地方?处理这个问题的最佳方法是什么?

标签: bashsh

解决方案


这是一个阴影案例,您可以在https://www.gnu.org/software/bash/manual/html_node/Shell-Functions.html下方找到有关它的信息

如果您尝试描绘它,内部范围变量会在外部范围变量上投射“阴影”并将其隐藏起来。一旦内部范围变量消失,程序就可以再次“找到”外部范围变量。

这几乎是编程中一般规则的另一种变体,其中更具体或引用内部范围的事物会覆盖更通用或外部范围的一部分的事物。

如果你写

temp="hi"
phrase(){
    echo "$temp"
    temp="hello"
    echo "$temp"
}
phrase

结果将是

hi
hello

因为内部作用域的变量“掩盖”了外部作用域的变量。

这可以通过使用另一个名称存储脚本的 $1 参数来防止。因此,正如您所说,最好的方法是通过将脚本参数存储在明确命名的变量中来确保所有变量具有不同的名称。

temp=$1
function1 () {
  echo "$1"
  echo "$temp"
}
function1 what
echo "$1"

编辑:我忘记考虑到脚本变量不能直接在函数中使用这一事实,如@gordondavisson 所说,所以即使你没有将“what”这个词作为参数传递给你的函数,你仍然无法打印单词“鸡”。因此,在这种情况下,在函数内使用参数的唯一可能方法是将 $1 分配给变量。


推荐阅读