Arrays Bash脚本数组

Arrays Bash脚本数组,arrays,bash,Arrays,Bash,我不熟悉bash脚本&试图理解事物是如何工作的。这一切都有点奇怪 可以将以下内容放入脚本或输入shell: declare -a A=("foo" "bar") B=1 [ ${A[B]} == ${A[$B]} ] && echo "wTF" || echo ";)" 这给了我debian压缩和cygwin 1.7.11-1的“wTF” 所以。为什么${A[B]}起作用?出于同样的原因A起作用:和出于同样的原因A起作用:和来自: 索引数组使用整数(包括算术表达式[…])引用,

我不熟悉bash脚本&试图理解事物是如何工作的。这一切都有点奇怪

可以将以下内容放入脚本或输入shell:

declare -a A=("foo" "bar")
B=1
[ ${A[B]} == ${A[$B]} ] && echo "wTF" || echo ";)"
这给了我debian压缩和cygwin 1.7.11-1的“wTF”


所以。为什么
${A[B]}
起作用?

出于同样的原因
A
起作用:和出于同样的原因
A
起作用:和来自:

索引数组使用整数(包括算术表达式[…])引用,并且是基于零的;[…]”下标被视为算术表达式,其计算结果必须大于或等于零

所以实际上,
${A[B]}
意味着
${A[$((B))]}
。当您想要像
${A[B-1]}
这样的东西时,这很方便

中解释了算术表达式,其中部分说明:

在表达式中,shell变量也可以通过名称引用,而不使用参数扩展语法

因此,
$((B))
意味着
$($B))
(除了前者在某些方面更聪明,例如,对于未初始化的变量,使用零而不是空白作为默认值)。

来自:

索引数组使用整数(包括算术表达式[…])引用,并且是基于零的;[…]”下标被视为算术表达式,其计算结果必须大于或等于零

所以实际上,
${A[B]}
意味着
${A[$((B))]}
。当您想要像
${A[B-1]}
这样的东西时,这很方便

中解释了算术表达式,其中部分说明:

在表达式中,shell变量也可以通过名称引用,而不使用参数扩展语法


因此,
$((B))
意味着
$($B))
(除了前者在某些方面更聪明,例如,对于未初始化的变量,使用零而不是空白作为默认值)。

确定。我读过。我还是不明白。假设我使用以下间接方式:
C=B;回音“${A[$C]}”;回显“${$C}”
?确定。我读过。我还是不明白。假设我使用以下间接方式:
C=B;回音“${A[$C]}”;echo“${$C}”
?@OliCharlesworth:在我们上次相遇后,我应该学会更好地与你争论!不过,我还是喜欢bash。我很喜欢。@thb:各有各的!但是在我看来,任何需要
[
成为可执行文件才能工作的语言都是一种糟糕透顶的语言。@OliCharlesworth:但是
[
不是可执行文件,而是一种内置的语言。(当然,这是一种缺陷--
[…]的行为)
表示法优越得多——但并不是说更改
$PATH
会突然中断
[
)@violet313:
[
测试
都是内置的;两者都不是对方的别名。但是,它们在所有方面都是等价的,只是
[
希望其最后一个参数是
]
(它丢弃了)。@OliCharlesworth,而不是
,尝试
类型-a[
。@OliCharlesworth:我应该学会在我们最后一次相遇后不与你争论!不过,我还是喜欢bash。我非常喜欢它。@thb:每个人都有自己的语言!但我认为,任何需要
[
为了工作而成为一个可执行文件是一种很糟糕的语言。@OliCharlesworth:但是
[
不是一个可执行文件,它是一个内置的。(当然,这是一个缺陷,
[[…]
符号的行为要高得多——但改变
$PATH
并不会突然中断
[
)@violet313:
[
test
都是内置的;两者都不是另一个的别名。但是,它们在所有方面都是等价的,除了
[
期望其最后一个参数是
]
(它丢弃了该参数)。@OliCharlesworth,而不是
其中[
try
type-a[