给定一个动态的事物列表,我想为列表中的每个事物添加一个计数器变量,以便从循环外部进行访问 - 理想情况下,$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:找不到命令" ?
答案 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并且想知道你找不到任何命令。