BASH - 作为数组名称一部分的变量(第2部分)

时间:2014-09-05 09:16:07

标签: arrays bash

我们假设我从item1=('item1' '1' '20')

开始

然后我定义itemnumber=2

我想将下一个数组创建为item$itemnumber=('item2' '4' '77'),但我收到语法错误。

之后我想itemnumber=$((itemnumber+1)),然后创建item$itemnumber=('item3' '17' '15')

哪个会给我三个数组item1,2和3:

item1=('item1' '1' '20')
item2=('item2' '4' '77')
item3=('item3' '17' '15')

这可能吗?

4 个答案:

答案 0 :(得分:5)

eval的任务:

itemnumber=1
(( itemnumber += 1))
eval "item$itemnumber=('item$itemnumber' '4' '77')"
eval echo \${item$itemnumber[*]} 

答案 1 :(得分:3)

使用declare命令,但您需要修改执行分配的方式。

declare -a "item$itemnumber"
declare "item$itemnumber+=(item$itemnumber 4 77)

bash 4.3中,使用命名引用大大简化了这一点。

itemnumber=0
declare -n arr=item$itemnumber
arr+=(item$itemnumber 1 20)
((itemnumber++))
declare -n arr=item$itemnumber
arr+=(item$itemnumber 4 77)
((itemnumber++))
declare -n arr=item$itemnumber
arr+=(item$itemnumber 17 15)

只需递增itemnumber,重置引用,然后像使用实际数组那样使用引用。

答案 2 :(得分:1)

有点迟到的答案,但如果您需要这么多次,可以使用函数进行分配

#!/bin/bash

assign () { eval "$1=($(printf '"%s" ' "$@"))"; }

itemnum=0
assign item$((++itemnum)) 1 2 3 4
assign item$((++itemnum)) 'q w e r'
assign item$((++itemnum)) a "$itemnum cc" dd  

#show the array members enclosed in ''
echo "item1:" $(printf "'%s' " "${item1[@]}")
echo "item2:" $(printf "'%s' " "${item2[@]}")
echo "item3:" $(printf "'%s' " "${item3[@]}")

打印

item1: 'item1' '1' '2' '3' '4'
item2: 'item2' 'q w e r'
item3: 'item3' 'a' '3 cc' 'dd'

或简单

echo ${item1[@]}
echo ${item2[@]}
echo ${item3[@]}

打印

item1 1 2 3 4
item2 q w e r
item3 a 3 cc dd

如果要排除,数组中的第一个元素(itemname),请使用

assign () { var="$1"; shift 1; eval "$var=($(printf '"%s" ' "$@"))"; }

n=0
assign item((++n)) 1 2 3 4
echo "item1 contains only: $item1[@]}"

打印

item1 contains only: 1 2 3 4

答案 3 :(得分:0)

在bash 4.3中,namevar是完美的工具:

set_item() {
  local itemnumber=$1; shift
  local -n array_name="item$itemnumber"
  array_name=( "$@" )
}
set_item 2   1 2 3 4
set_item 3   2 3 4 5

...将与...具有相同的效果。

item2=( 1 2 3 4 )
item3=( 2 3 4 5 )