间接返回数组中的所有元素

Modified on: Sat, 30 Jun 2018 04:42:00 +0800

Bash手册页描述了使用${!a}来返回变量的内容,该变量的名称是a(间接级别)的内容。

我想知道如何使用这个返回数组中的所有元素,即

a=(one two three)
echo ${a[*]}

返回

one two three

我想:

b=a echo ${!b[*]}

返回相同的内容。不幸的是,它没有,但返回0

更新强>

鉴于回复,我现在意识到我的例子太简单了,因为当然是这样的:

b=("${a[@]}")

将完全达到我所说的所需。

所以,这就是我尝试做的事情:

b=a
echo ${!b[*]}

当然,仔细阅读Bash手册页显示这不会按预期工作,因为最后一行只返回“array”$_LIST的索引(根本不是数组)

在任何情况下,以下都应该完成工作(如指出):

b=("${a[@]}")

或...(我最终走的路线):

LIST_lys=(lys1 lys2)
LIST_diaspar=(diaspar1 diaspar2)

whichone=$1   # 'lys' or 'diaspar'

_LIST=LIST_$whichone
LIST=${!_LIST[*]}

当然,假设元素不包含空格。

最佳答案

我认为应该从字面上对待使用bash变量的间接引用。

EG。对于您的原始示例:

a=(one two three)
echo ${a[*]} # one two three
b=a
echo ${!b[*]} # this would not work, because this notation 
              # gives the indices of the variable b which
              # is a string in this case and could be thought
              # as a array that conatins only one element, so
              # we get 0 which means the first element
c='a[*]'
echo ${!c} # this will do exactly what you want in the first
           # place

对于最后一个真实场景,我相信下面的代码可以完成这项工作。

LIST_lys=(lys1 lys2)
LIST_diaspar=(diaspar1 diaspar2)

whichone=$1   # 'lys' or 'diaspar'

_LIST="LIST_$whichone"[*]
LIST=( "${!_LIST}" ) # Of course for indexed array only 
                     # and not a sparse one

最好使用符号"${var[@]}",这样可以避免弄乱$IFS和参数扩展。这是最终的代码。

LIST_lys=(lys1 lys2)
LIST_diaspar=(diaspar1 diaspar2)

whichone=$1   # 'lys' or 'diaspar'

_LIST="LIST_$whichone"[@]
LIST=( "${!_LIST}" ) # Of course for indexed array only 
                     # and not a sparse one
                     # It is essential to have ${!_LIST} quoted
作者:,weynhamz

相关问答

添加新评论