Bash:使用变量作为找到的数组名称程序,但无法理解它可以解释

时间:2015-02-09 04:36:38

标签: arrays bash variables

我发现以下程序按我的意愿工作,但我无法理解它是如何工作的,有人可以为我详细解释有关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

1 个答案:

答案 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)