我发现以下程序按我的意愿工作,但我无法理解它是如何工作的,有人可以为我详细解释有关while循环的信息
while IFS=" " read user time; do
eval "item=\${#$user[@]} ; $user[\$item]=\(\$((\$item + 1)),$time\)"
[[ "${arraynames[@]}" =~ $user ]] || arraynames[${#arraynames[@]}]=$user
done<test.txt
for arrayname in ${arraynames[@]}; do
eval "array=(\${$arrayname[@]})"
echo "$arrayname has ${#array[@]} entries:"
for item in ${!array[@]}; do
echo "$arrayname[$item] = ${array[$item]}"
done
echo
done
答案 0 :(得分:0)
while
循环构建一组数组,其中包含文件中每个命名用户的时间条目。
将输入分隔符设置为空格,将test.txt中的每一行读取到$user
和$time
。
while IFS=" " read user time; do
接下来使用$user
和$time
的值生成并执行。对于每一行。例如,让我们使用user = me和time = 100.
所以当user = me和time = 100时,这个:
eval "item=\${#$user[@]} ; $user[\$item]=\(\$((\$item + 1)),$time\)"
相当于:
eval "item=\${#me[@]} ; me[\$item]=\(\$((\$item + 1)),100\)"
并评估为:
item=${#me[@]} # length of array me
me[$item]=($(($item + 1)),100) # set last index of me to ($item+1,100)
如果$arraynames
有“我”,则进行下一次测试,如果没有则添加。
[[ "${arraynames[@]}" =~ $user ]] || arraynames[${#arraynames[@]}]=$user
某些可能令人困惑的符号。对于数组:array=(userA userB userC)
${array[@]}
- 数组的内容(例如“userA userB userC”)${#array[@]}
- 数组的长度(例如3)