我们假设我从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')
这可能吗?
答案 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 )