2016-12-03 1 views
1

데이터가있는 배수 배열이 있고 이제는 배열의 각 요소를 인쇄하려고합니다.하지만 항상 모든 값이 같아집니다. 이것은 내 코드입니다.여러 개의 값을 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 [email protected]$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] 

여러분도 알다시피 나는 배열 요소에 대해 항상 같은 값을 가지고 있습니다. 뭐가 잘못 되었나요?

답변

2

printf 문에 중괄호가 필요합니다 (등). printf 이후에 이전보다 counter이 증가합니다.

+0

좋습니다. 작동합니다. 감사 – colymore

관련 문제