2

我需要在 ksh 中回显 UID 的进程信息:

#!/bin/ksh
read userid
arr=$(ps -elf | nawk -v pattern=${userid} '{if ($3==pattern) print}')
arrlen=${#arr[@]}
echo $arrlen
for f in "${arr[@]}"; do
  echo $f
done

arr 是此 UID 的进程数组。arrlen 总是等于 1。为什么?我的第二个问题:我尝试回显 arr 中的所有元素,输出是

0 
S  
s157759 
22594   
1   
0  
50 
20  
?  
2:06 
/usr/lib/firefox/firefox-bin

代替

 0 S  s157759 22594   1   0  50 20  ?  62628  ? 11:14:06 ?  2:06 /usr/lib/firefox/firefox-bin

在一行中

我想用线条而不是文字创建一个数组。

4

1 回答 1

2

您没有创建数组;您正在创建一个带有换行符分隔值的字符串。代替

arr=$(ps -elf | nawk -v pattern=${userid} '{if ($3==pattern) print}')

arr=( $(ps -elf | nawk -v pattern=${userid} '{if ($3==pattern) print}') )

但是,这仍然会给您留下一个问题,即数组会将每行的每个字段ps视为一个单独的元素。更好的解决方案是ps使用read内置的读取目录:

ps -elf | while read -a fields; do
    if [[ ${fields[2]} = $userid ]]; then
      continue
    fi
    echo "${fields[@]}"
done
于 2013-03-18T19:30:32.753 回答