以下脚本在使用 bash-5 的 FreeBSD 上按预期工作:
function a {
declare -gA Seen
if [[ -v Seen[$1] ]]
then
echo "Saw $1 already"
return
fi
Seen[$1]=''
}
a a
a a
a b
a a
a b
产生以下输出:
Saw a already
Saw a already
Saw b already
然而,在 RHEL7 上,bash 较旧(4.2),重复的参数永远不会被识别为已经看到的 - 就好像每次调用函数时都会重新创建
Seen
数组一样。将 declare
行移到函数之外——进入全局范围——没有帮助。
也许有解决方法吗?函数在调用之间(在同一个 bash 进程内)保持其状态的某种方法?
对于你似乎想要做的事情,我只是像我们在惯用的 awk 中所做的那样:
a() {
declare -gA Seen
if (( Seen[$1]++ ))
then
echo "Saw $1 already"
return
fi
}