源码(后文 listA 和 listB 数组简称 A 数组和 B 数组):
#!/bin/bash
AA(){
for ii in "${listB[@]}"; do #|
: #| ==> 这 AA 方法中的 for 循环目的是遍历 B 数组,但什么都不做。
done #|
}
listA=(1) #
listB=(a b c d) #___这四行仅仅定义和打印出两个数组中的元素(后文结果中的前两行内容)
echo "listA: ${listA[@]}" #
echo "listB: ${listB[@]}" #
for ii in "${listA[@]}"; do
echo "在 AA 方法前的值: ${ii}" # 传 ii 给方法 AA 前看值是多少
AA "${ii}" # 将遍历的 ii 传给方法 AA
echo "在 AA 方法后的值: ${ii}" # 传 ii 给方法 AA 后看值是多少
done
输出结果:
listA: 1
listB: a b c d
在 AA 方法前的值: 1
在 AA 方法后的值: d
可以看到:遍历数组 A 时所用的变量 ii 和方法内遍历数组 B 时所用变量是相同的,但这变量 ii 为何是全局变量啊?我尝试了以下写法:
local ii
local ii
好像最终输出的都是 listB 数组的最后一个元素值,这又是怎么个操作? 有点懵,以前没遇到过,有大佬解惑吗?
1
mylovesaber OP 问错了。。。等重新编辑。。。
|
2
mylovesaber OP @mylovesaber 好像没问错。。。这 ii 不应该是专属于当前 for 循环的变量么?为何会成为了全局变量?
|
3
momocraft 2023-02-23 19:11:54 +08:00
sh (bash) 的变量不是 lexical scope, 是 dynamic scope
AA 有了 local ii 后不应该覆盖外面的 ii 能把你的完整代码贴出来看看吗 |
4
mylovesaber OP 在 AA 方法中的 for 循环前后都加上 `echo $1`,可以看到打印的两次 $1 结果都是 A 数组中的元素值 1 ,说明传进去的的确是 1 ,但这是 ii 的值啊,数组内部 ii 值被循环中的 ii 替换后,为何 $1 值没变?
|
5
mylovesaber OP @momocraft 这个说法第一次听说,我一楼发的那个就是完整的测试源码,可以得到方法内部的 for 循环中 ii 值的确可以把方法外部套的循环中的 ii 值给替换掉的结论,你直接复制粘贴删掉注释运行就能看到结果
|
6
mylovesaber OP @momocraft 不好意思刚刚可能有什么操作失误的地方,local 只能用在方法内,刚刚查了下好像明白 local 生效的原因了,但有点诧异为啥别的语言 for 循环的类似 shell 的 ii 位置只能作用于该循环内,而方法内不声明 local 的话,shell for 循环中的 ii 会是全局变量
|
7
mylovesaber OP |