- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑:这已被确认为错误并将被修复:https://lists.gnu.org/archive/html/bug-bash/2018-03/msg00055.html
所以我在摆弄 bash 的间接功能 namerefs。我以为我已经掌握了窍门,但当我试图弄清楚如何将 nameref 变成常规变量时,我突然遇到了一些让我困惑的事情。
这是来自 man bash
的相关段落:
declare -n
Give each name the nameref attribute, making it a name reference to another variable. That other variable is defined by the value of name. All references, assignments, and attribute modifications to name, except those using or changing the -n attribute itself, are performed on the variable referenced by name's value.
假设您想取消设置一个名称引用——不是它指向的变量,而是变量本身。你不能只说 unset foo
,因为这实际上会取消设置 foo
指向的任何内容;相反,您必须将其设为常规变量,然后取消设置:
$ declare -p
$ foo=bar; bar='hello world'
$ declare -p
declare -- foo="bar"
declare -- bar="hello world"
$ declare -n foo; declare -p # 'foo' is now a nameref
declare -n foo="bar"
declare -- bar="hello world"
$ declare +n foo; declare -p # 'foo' is no longer a nameref
declare -- foo="bar"
declare -- bar="hello world"
$ unset foo; declare -p # 'foo' is unset, not bar
declare -- bar="hello world"
这一切对我来说都是有意义的,并且与我对上述手册段落的阅读是一致的。令我困惑的是上面的一个小变化会发生什么——也就是说,我们保留 bar
未设置和未声明:
...
$ declare -p
declare -n foo="bar"
$ echo "${foo}" # These two commands behave as expected--i.e., identically to how namerefs usually behave, just with an unset variable.
-bash: foo: unbound variable
$ echo "${!foo}"
bar
$ declare +n foo; declare -p # Should make 'foo' a regular variable, right? Nope.
declare -n foo="bar" # Still a nameref--wtf?
declare -- bar # And now bar's back--unset still, but declared. Wtf??
$ declare +n foo; declare -p # THIS, however, works like I thought it would--but *why*? In both cases 'bar' is unset...
declare -- foo="bar"
declare -- bar
我显然误解了 nameref 应该如何工作。根据 man 的文章,我认为取消设置 foo
的 nameref 属性应该适用于 foo
,无论它的目标是 bar
, 未声明。
请注意,当 bar
未设置但已声明时,它的工作方式与我想象的一样。这对我来说是最奇怪的部分——我没有意识到未声明的变量有任何意义! test -v
、${var-_}
、${var+_}
和 set -u
所有似乎都只关心变量是否设置,并且不区分 (A) 未设置、未声明的变量和 (B) 未设置、已声明的变量。
有人可以解释一下这里发生了什么,也许可以指出手册中对此进行解释的部分吗?在 namerefs 的行为中是否还有其他特殊情况会让我感到困惑?谢谢!
$ bash --version
GNU bash, version 4.4.19(1)-release (x86_64-unknown-linux-gnu)
...
$ echo "$-"
himuBCHs
请注意,在没有 set -u
的情况下,该行为仍然存在;我这样做只是为了使 bash 的消息更清晰一些。
最佳答案
unset
有一个新参数,明确用于取消定义 nameref(与它指向的变量相反):
unset -n namevar
关于bash - 使 nameref 成为 bash 中的常规变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49179596/
当我也通过管道进入我的函数时,我无法让 bash namerefs 正常工作。 我在下面有一个函数,它接受一个 json blob 并将其转换为一个 bash 关联数组。由于 bash 不能按值传递关
我正在替换我不熟悉的代码中一些已弃用的 Javadoc 注释。大多数 javadoc 注释很容易翻译为 org.apache.felix.scr.annotations,但我不确定如何翻译这个: /*
编辑:这已被确认为错误并将被修复:https://lists.gnu.org/archive/html/bug-bash/2018-03/msg00055.html 所以我在摆弄 bash 的间接功能
本文整理了Java中org.mozilla.javascript.xml.XMLLib.nameRef()方法的一些代码示例,展示了XMLLib.nameRef()的具体用法。这些代码示例主要来源于G
在 stackoverflow 的另一个问题中,我询问了如何将数组传递给函数。一个答案向我推荐了以前的答案。 一个答案表明,使用 -n 选项声明,引用,对于将数组传递给函数很有用,如下所示, decl
我是一名优秀的程序员,十分优秀!