我必须创建一个脚本,使得PIDS大于20的所有进程的总和。它有点工作,但出了点问题。我知道这是简单的,基本的东西,但我无法得到逻辑。
例如,我有2个进程,“1504”和“1405”。我的总和结果是15041405.如何重新编写sum + = $ {proc [$ i]}来实现总和,而不是字符串附加?
proc=( $(ps | cut -d ' ' -f1) )
nr=$(ps | cut -d ' ' -f1 | wc -l)
sum=0
for (( i=0 ; i<=nr ; i++)); do
[[ ${proc[$i]} -gt 20 ]] && sum+=${proc[$i]}
done
echo $sum
答案 0 :(得分:2)
使用数学上下文。在POSIX中:
sum=$(( sum + val ))
...或者,也是有效的POSIX:
: "$(( sum += val ))"
......或者,在bash中:
(( sum += val ))
您还可以在数学上下文中使用更容易阅读的比较操作,而不是在非数学测试上下文中使用-gt。在bash:
(( ${proc[$i]} >= 20 )) && (( sum += ${proc[$i]} ))
...或者在POSIX shell中(它不支持数组,因此无法完全重现您的示例代码):
: "$(( sum += ( val < 20 ) ? 0 : val ))"
如果您尝试执行计数 PID的(更明智的)操作,我会考虑更像下面的实现(仅限bash,仅限Linux,但效率更高) :
count=0
for pid_file in /proc/[0-9]*; do
pid=${pid_file##*/}
(( pid > 20 )) && (( count++ ))
done
printf '%s\n' "$count"
...或者,将更多的精力放在glob引擎上:
# avoid inflating the result with non-matching globs
shopt -s nullglob
# define a function to avoid overwriting the global "$@" array
count_procs() {
set -- /proc/[3-9][0-9] /proc/[0-9][0-9][0-9]*
echo "$#"
}
# ...used as follows:
count_procs