繁体   English   中英

BASH:数组元素成为新数组的名称

[英]BASH: Array element becoming the name of a new array

我有一个数组bucket1=('10' '22' 'bucket1')

如您所见,元素之一是数组bucket1的名称

现在,我通过复制bucket1创建一个新数组:

array1=("${bucket1[@]}")

现在,我要更改array1中的元素之一:

array1[1]='30'

echo ${array1[@]}给出10 30 bucket1

现在我要养活那变回阵列bucket1 ,但不知道array1从创建bucket1 相反,我想使用array1的第三个元素,即bucket1

就像是:

declare -a ${array1[2]}=${array1[@]}

这样我最终得到了新的bucket1数组,其中包含('10' '30' 'bucket1')

简而言之:我想复制一个数组,更改复制的数组,使用复制数组中的元素之一作为原始数组的名称,将复制数组中的更改应用于原始数组。

这可能吗?

bucket1=(10 20 bucket1)
tmp=("${bucket1[@]}")
tmp[1]=30
declare -a "${tmp[2]}"=("${tmp[@]}")
bash: syntax error near unexpected token `('

嗯,那行不通。 一对一尝试

for i in ${!tmp[@]}; do declare "${tmp[2]}[$i]"="${tmp[i]}"; done
echo ${bucket1[1]}
30

这在ksh93中更容易

$ bucket1=(10 20 bucket1)
$ nameref tmp=bucket1
$ tmp[1]=30
$ echo ${bucket1[1]}
30

您可以使用read -ra代替在这里declare

$> bucket1=('10' '22' 'bucket1')
$> array1=("${bucket1[@]}")
$> array1[1]='30 50'
$> declare -p array1
declare -a array1='([0]="10" [1]="30 50" [2]="bucket1")'

$> IFS=$'^G' && read -ra "${array1[2]}" < <(printf "%s^G" "${array1[@]}")
$> declare -p "${array1[2]}"
declare -a bucket1='([0]="10" [1]="30 50" [2]="bucket1")'
$> declare -p bucket1
declare -a bucket1='([0]="10" [1]="30 50" [2]="bucket1")'

所有这些declare -p已用于打印数组内容,并且可以在真实脚本中删除。

^G是同时使用Control V G键入的。

只需做一些工作,就可以以适合于在declare的参数中使用的形式获得数组的值。

IFS="=" read _ value <<< "$(set | grep '^array1=')"
declare -a "${array1[2]}=$value"

要解决bash 4.3中已修复的错误,必须使用命令替换引起的引号。 但是,如果您具有该版本的bash ,则可以使用命名引用来简化此操作:

declare -n tmp=${array1[2]}
tmp=("${array1[@]}")

尝试这个:

unset ${array1[2]}
declare -a ${array1[2]}="`echo ${array1[@]}`"

首先我们清除数组,然后echo的输出将存储在新的数组名称中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM