bash - 如何区分函数参数和脚本参数
问题描述
假设我有一个名为 hello 的脚本
$ cat hello
function1 () {
echo $1
}
function1 what
echo $1
我打电话给
$ sh hello chicken
what
chicken
我如何引用函数内部的脚本参数(鸡)。我是否必须重命名所有脚本参数或将它们存储在其他地方?处理这个问题的最佳方法是什么?
解决方案
这是一个阴影案例,您可以在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 分配给变量。
推荐阅读
- regex - 使用正则表达式在末尾匹配带有元音的字符串
- java - 直接从硬盘扇区读取,java中没有任何第三方
- java - 我如何保证在没有额外请求的情况下成功删除或更新?
- android - 无法读取 Firebase 动态链接的未定义属性“清单”
- android - 我怎么知道焦点何时在 viewpager 内的片段之一上?
- react-native - React 360 HTML 在 React Native WebView 中不显示任何内容
- java - Android位置(经纬度)
- jquery - 将类和字体样式添加到 html 并返回 html jQuery
- sqlite - 在 Ubuntu 14.04 上为 Python3.6 安装 Sqlite3
- c - 返回结构并将结构传递给函数