循环名称参考

时间:2015-11-18 09:20:05

标签: bash

我有这个脚本:

#!/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

这是什么意思?如何解决这个问题?

1 个答案:

答案 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开头的变量) }}"),你必须拒绝不安全的输入。