【问题标题】:Circular name reference循环名称参考
【发布时间】:2016-02-19 22:46:27
【问题描述】:

我有这个脚本:

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

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

【问题讨论】:

  • array=(a "b c" "d") 重命名为 somethingelse=(a "b c" "d")
  • @amdixon 是的,这有帮助,但 local -n array=$1 不应该工作吗?
  • 当你执行contains array value时,函数的第一行变成了local -n array=array。看到循环引用了吗?
  • 查看 BashFAQ/048 中的确切问题,顺便说一句:mywiki.wooledge.org/BashFAQ/048#line-120
  • @4ae1e1 这将是一个很好的答案

标签: bash


【解决方案1】:

我们重点关注函数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]我们无法为名称引用提供安全名称。如果调用者的变量恰好同名,我们就完蛋了。

...

现在,尽管有这些缺点,@​​987654329@ 功能是朝着正确方向迈出的一步。但是你必须小心选择一个调用者不会使用的名字(这意味着你需要对调用者进行一些控制,如果只是说“不要使用以_my_pkg开头的变量”),你必须拒绝不安全的输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 2021-12-02
    相关资源
    最近更新 更多