簡體   English   中英

在bash中打印多個值形成多個數組

[英]Print multiple values form multiple arrays in bash

我有多個填充了數據的數組,現在我想打印這些數組的每個元素,但我總是得到相同的值。 這是我的代碼:

#!/bin/bash
hertz=$(getconf CLK_TCK)
PIDS=$(ls -la /proc | awk '{print $9}' | grep "^[0-9]*$")
PIDLIST=$(echo $PIDS | tr "" "\n")
counter=0
declare -A USER
declare -A PRIORITY
declare -A VIRTUALMEMORY
declare -A CPUUSAGE
declare -A MEMORY
declare -A NAME
declare -A TIME

printf "%-10s %-10s %-10s %-10s %-10s %-10s %-10s %-11s %-10s\n" PID USUARIO PR VIRT S %CPU %MEM TIME COMMAND

for PID in $PIDLIST; do
    if [ -d /proc/$PID ]; then
        #--CALCULATE USER--#
        useruid=$(awk '/Uid/ {print $2}' 2> /dev/null < /proc/$PID/status)
        user=$(getent passwd $useruid | cut -d: -f1)
        #--CALCULATE PRIORITY--#
        PRIORITY[$counter]=$(awk '{print $18}' 2> /dev/null < /proc/$PID/stat)
        #--CALCULATE VIRTUAL MEMORY--#
        VIRTUALMEMORY[$counter]=$(awk '{print $23}' 2> /dev/null < /proc/$PID/stat)
        #--CALCULATE STATE--#
        STATE[$counter]=$(awk '{print $3}' 2> /dev/null < /proc/$PID/stat)
        #--CALCULATE CPU TIME--#
        #-- user_util = 100 * (utime_after - utime_before) / (time_total_after - time_total_before); --#
        uptime=$(awk '{print $1}' < /proc/uptime)
        utime=$(awk '{print $14}' < /proc/$PID/stat)
        stime=$(awk '{print $15}' < /proc/$PID/stat)
        cutime=$(awk '{print $17}' < /proc/$PID/stat)
        cstime=$(awk '{print $16}' < /proc/$PID/stat)
        starttime=$(awk '{print $22}' < /proc/$PID/stat)
        totaltime=$(($utime+$stime+$cutime+$cstime))
        middlevalue=$((starttime / hertz))
        seconds=$(echo "scale = 2; $uptime-$middlevalue" | bc)
        middlevalue=$(echo "scale = 2;$totaltime/$hertz" | bc)
        middlevalue=$(echo "scale = 3;$middlevalue/$seconds" | bc)
        CPUUSAGE[$counter]=$(echo "scale = 2; $middlevalue*100" | bc | awk '{printf "%.2f", $0}')
        #--CALCULATE %MEMORY--#
        MEMORY[$counter]=$(echo 0 $(awk '/Pss/ {print "+", $2}' 2> /dev/null < /proc/$PID/smaps) | bc)
        #--CALCULATE TIME--#
        TIME[$counter]=$(date -d@$seconds -u +%H:%M:%S)
        #--CALCULATE NAME--#
        NAME[$counter]=$(awk '{print $1}' 2> /dev/null < /proc/$PID/cmdline)
        counter=$((counter + 1))
        printf "%-10s %-10s %-10s %-10s %-10s %-10s %-10s %-11s %-10s\n" $PID $user "$PRIORITY[$counter]" "$VIRTUALMEMORY[$counter]" "$STATE[$counter]" "$CPUUSAGE[$counter]" "$MEMORY[$counter]" "$TIME[$counter]" "$NAME[$counter]"
    fi

done

這是我的輸出。

PID        USUARIO    PR         VIRT       S          %CPU       %MEM       TIME        COMMAND
1          root       20[-1]     3756032[-1] S[hB1]     0.10[-1]   0[-1]      21:22:27[-1] /sbin/init[-1]
10         root       20[-1]     3756032[-1] S[hB1]     0.10[-1]   0[-1]      21:22:27[-1] /sbin/init[-1]
11         root       20[-1]     3756032[-1] S[hB1]     0.10[-1]   0[-1]      21:22:27[-1] /sbin/init[-1]
1140       root       20[-1]     3756032[-1] S[hB1]     0.10[-1]   0[-1]      21:22:27[-1] /sbin/init[-1]
1145       root       20[-1]     3756032[-1] S[hB1]     0.10[-1]   0[-1]      21:22:27[-1] /sbin/init[-1]
1167       root       20[-1]     3756032[-1] S[hB1]     0.10[-1]   0[-1]      21:22:27[-1] /sbin/init[-1]
12         root       20[-1]     3756032[-1] S[hB1]     0.10[-1]   0[-1]      21:22:27[-1] /sbin/init[-1]

如您所見,數組元素的值始終相同。 怎么了?

您需要在printf語句中使用大括號: ${PRIORITY[$counter]}等。還要在printf而不是之前增加counter

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM