【发布时间】:2021-03-21 19:35:19
【问题描述】:
我在release notes of Bash 5.1 中看到了这些有趣的项目:
z。 `@a' 变量转换现在打印未设置数组变量的属性。
啊。 `@A' 变量转换现在打印一个声明命令,如果变量具有属性但未设置,则该命令设置变量的属性。
让我们来看看它们是如何工作的。首先,使用 Bash 4.3 查看进度并查看它们曾经产生的相同:
$ declare -A arra=([k1]="v1" [k2]="v2" [k3]="")
$ echo "${arra[@]@a}"
v1 v2
$ echo "${arra[@]@A}"
v1 v2
现在在 Bash 5.1 中使用 sequence of alternating keys:
$ declare -A arra=(k1 v2 k2 v2 k3)
$ echo "${arra[@]@a}"
A A A
$ echo "${arra[@]@A}"
declare -A arra=([k1]="v1" [k2]="v2" [k3]="" )
所以@A 有助于查看数组的定义,而@a 为每个关联值提供一个“A”。可以?
检查Bash 5.1 Reference Manual → Arrays section 说:
${parameter@operator}一个
扩展是一个字符串,由代表参数属性的标志值组成。
但我看不出除了“A”之外还有什么可以作为输出。如果我对普通变量使用它,它不会产生任何东西:
$ v=1 $ 回声“${v@a}” # 没有 $ v="你好" $ 回声“${v@a}” # 没有【问题讨论】:
-
您将看到
A以外的输出,例如declare -i v=1或declare -l v="Hello",对于导出的变量:declare -x v=1也有其用途。 -
实际上对于所有标志(
-n除外):for f in a A i l n r t u x; do (declare -$f v; echo "$f: ${v@a}"); done。对于变量引用,@a将显示目标的标志:declare -i a=1; declare -n v=a; echo "${v@a}"。 -
@gniourf_gniourf 哦,很有趣。所以我们可以有“A”代表关联数组,“i”代表整数,“il”代表...?,“a”代表数组,“x”代表...
-
是的,
il很有趣:)。这些标志将以有趣(且不一致)的方式组合(运行我在上一条评论中给出的命令,没有declare的子shell)。 -
@gniourf_gniourf 相当不错!如果我使用
for f in a A i l n r t u x; do declare -$f v; echo "$f: ${v@a}"; done,有些不能一起工作,并且我还会提示错误“bash: declare: `1': invalid variable name for name reference”。无论如何,您评论的是非常好的信息,可以作为一个很好的答案:)
标签: bash