我有这个脚本:
#!/bin/bash
function contains() {
local -n array=$1
local value=$2
for item in "${array[@]}"; do
[ "$item" = "$value" ] && return 0
done
return 1
}
array=(a "b c" "d")
value="b c"
contains array value
运行它我收到此错误:
***: line 6: warning: array: circular name reference
这是什么意思?如何解决这个问题?
答案 0 :(得分:7)
让我们关注函数contains
的第一行:
local -n array=$1
执行时
contains array value
$1
设置为array
,因此local
命令在扩展后变为
local -n array=array
其中循环引用很明显。
这是一个没有完美解决方案的已知问题(请参阅BashFAQ / 048中的"The problem with bash's name references")。我会建议那里有什么建议:
[T]这里没有我们可以给名称参考的安全名称。如果来电者的变量恰好具有相同的名称,我们就会搞砸。
...
现在,尽管有这些缺点,
declare -n
功能仍是朝着正确方向迈出的一步。但是你必须小心选择呼叫者不会使用的名称(这意味着你需要对呼叫者进行一些控制,如果只是说"不要使用以{{1开头的变量) }}"),你必须拒绝不安全的输入。