var + =添加字符串而不是sum

时间:2014-02-01 15:00:41

标签: shell scripting

我必须创建一个脚本,使得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

1 个答案:

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