从bash中的动态变量列表创建子变量?

时间:2014-03-11 23:35:10

标签: bash shell variables

给定一个动态的事物列表,我想为列表中的每个事物添加一个计数器变量,以便从循环外部进行访问 - 理想情况下,$X的计数将由下式给出:

for THING in `cat list.txt` 
    #do stuff with $THING
done

echo $Xcount

显然"$THING"count=value不起作用,$\$的几次迭代也没有给我我想要的东西。

命令:

echo "$THING"count=value

是我想要执行的内容,但单独返回它会产生此错误:

echo "$THING"count=value
bash: Xcount=value: command not found

引用该值不会改变结果。

是否有一种干净的方式以这种方式解决这个问题?

请注意,每个$ THING将保存一个字符串值,而不是数字和事物列表的内容会随着时间而变化。如果" W"似乎我需要一个计数器,如果X从列表中消失,我仍然需要一个计数器 - 所以我不会想到一对数组(一个用于项目,一个对于计数而言)是要走的路,即使它可以通过每次扩展和求助来使其工作 - 我希望O(1)访问时间,内存空间是"免费"在这个例子中,IO和CPU是我的优化约束。

Rici的建议是可用的(基于循环的示例遵循那些对该解决方案足够好的人):

 
unset COUNT
declare -A COUNT
for ITEM in X Y Z; do
THING=$ITEM;
((COUNT[$THING]+=1));
done

for i in "${!COUNT[@]}" do echo -n "key : $i" " "; echo "value: ${COUNT[$i]}"; done

但我的偏好是实际上能够声明变量Xcount Ycount和Zcount,如果提供的列表是X Y和Z.有没有办法做到这一点,即从循环内部执行:

 
echo "$THING"count=value
echo "$THING"count=value

没有得到" bash:Xcount = value:找不到命令" ?

2 个答案:

答案 0 :(得分:0)

使$COUNT成为一个关联数组并设置

COUNT[$THING]=value

持怀疑态度的愚蠢示例:

$ declare -A COUNT
$ THING=X
$ COUNT[$THING]=3
$ THING=Y
$ COUNT[$THING]=42
$ THING=X
$ ((COUNT[$THING]+=7))
$ echo ${COUNT[X]} ${COUNT[Y]}
10 42

答案 1 :(得分:0)

这里,let命令对于允许动态创建变量名称很有用。要访问这些值,您可能需要间接变量:

for thing in foo bar baz foo bar foo; do
    let "${thing}count++"
done

for thing in foo bar baz; do
    varname=${thing}count
    echo "$varname = ${!varname}"
done
foocount = 3
barcount = 2
bazcount = 1

我实际上不建议这样做:关联数组在概念上更容易处理。

不要习惯使用ALL_CAPS_VARNAMES:有一天你会使用PATH并且想知道你找不到任何命令。