[英]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.