[英]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.