函数内能否访问与局部变量同名的全局变量?含Shell代码示例
没问题,我来帮你把这两个问题说清楚,结合你给的bash脚本场景:
1. 通用技术问询:能否在函数内部访问与局部变量同名的全局变量?
当然可以!不过有个前提:当函数内部定义了和全局变量同名的局部变量时,局部变量会优先屏蔽全局变量——直接用变量名(比如x)调用的话,取到的是局部的那个值。但shell(比如bash)提供了专门的语法,可以绕过这个屏蔽,直接读取或修改对应的全局变量。
2. 具体场景问询:针对你给出的bash代码
先把你的代码再贴一遍方便参考:
# Global variable x x="Hi" foo() { # Local variable x local x="Hello" }
答案是完全可以在foo函数内部读取并修改全局变量x,具体操作方法如下:
读取全局变量x
直接用echo $x会输出局部的Hello,要拿到全局的Hi,有两种常用方法:
- 方法一(bash 4.3+适用):用
${变量名@G}的参数扩展语法,直接获取全局变量的值:foo() { local x="Hello" echo "全局x的当前值:${x@G}" # 输出Hi } - 方法二(全版本兼容):用
eval命令绕过局部变量的屏蔽,直接读取全局变量:foo() { local x="Hello" eval 'echo "全局x的当前值:$x"' # 输出Hi }
修改全局变量x
要修改全局的x而不影响局部变量,同样有两种方法:
- 方法一(bash 4.2+适用):用
declare -g显式声明要操作的是全局变量:foo() { local x="Hello" declare -g x="我是修改后的全局x" # 修改全局变量 echo "局部x的值:$x" # 还是输出Hello } foo echo "修改后的全局x:$x" # 输出"我是修改后的全局x" - 方法二(全版本兼容):用
eval命令直接修改全局变量:foo() { local x="Hello" eval 'x="我是修改后的全局x"' # 修改全局变量 echo "局部x的值:$x" # 依然输出Hello } foo echo "修改后的全局x:$x" # 输出"我是修改后的全局x"
内容的提问来源于stack exchange,提问作者user247763
相关产品推荐
相关产品推荐

