工作中很多脚本都是用 Shell 和 Python 完成的,在上周环境中遇到了一个 Bug,导致部分功能失败,最后发现是 Shell 作用域的问题。
举例 链接到标题
$ tree .
.
├── test.sh
└── utils.sh
0 directories, 2 files
$ cat utils.sh
#!/usr/bin/env bash
function echo_test {
for i in `seq 2 3`;do
echo "utils.sh" $i
done
}
$ cat test.sh
#!#/usr/bin/env bash
. utils.sh
for i in `seq 1 5`;do
echo "before utils.sh" $i
echo_test
echo "after utils.sh" $i
echo "#################"
done
$ bash test.sh
before utils.sh 1
utils.sh 2
utils.sh 3
after utils.sh 3
#################
before utils.sh 2
utils.sh 2
utils.sh 3
after utils.sh 3
#################
before utils.sh 3
utils.sh 2
utils.sh 3
after utils.sh 3
#################
before utils.sh 4
utils.sh 2
utils.sh 3
after utils.sh 3
#################
before utils.sh 5
utils.sh 2
utils.sh 3
after utils.sh 3
#################
解决方式 链接到标题
在 utils.sh 的函数中对所用变量加上 local 用来声明其作用域局限于函数内。
$ cat utils.sh
#!/usr/bin/env bash
function echo_test {
local i
for i in `seq 2 3`;do
echo "utils.sh" $i
done
}
$ bash test.sh
before utils.sh 1
utils.sh 2
utils.sh 3
after utils.sh 1
#################
before utils.sh 2
utils.sh 2
utils.sh 3
after utils.sh 2
#################
before utils.sh 3
utils.sh 2
utils.sh 3
after utils.sh 3
#################
before utils.sh 4
utils.sh 2
utils.sh 3
after utils.sh 4
#################
before utils.sh 5
utils.sh 2
utils.sh 3
after utils.sh 5
#################