如何区分函数参数和脚本参数

问题描述 投票:0回答:2

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

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

我打电话

$ sh hello chicken
what
chicken

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

bash sh
2个回答
1
投票

这是一个影子案例,您可以在下面找到相关信息 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 分配给变量。


0
投票

  #This should demostrate the situation somewhat

#! /bin/bash -f 

# author: pitprok
# ammended by: acs
# date:13Apr2024

# scriptname: scopeTest.sh

# =============================

temp="hi"

#==========================

phrase() {

  #local temp="bye"  # temp to local scope
  echo "2 $temp"
  temp="hello"  
  # without local define, temp is global 
  echo "3 $temp"
   }

#===========主要==============`

echo "1 $temp"

  phase

`echo "4 $temp"`

 # put this in a script and run it then un-comment line "local temp" and notice the difference on the re-run

© www.soinside.com 2019 - 2024. All rights reserved.