ksh中的数组长度总是返回1,为什么数组不是行

时间:2013-03-18 19:20:01

标签: linux bash shell unix ksh

我需要在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

在一行

我想用线创建一个数组,而不是单词。

1 个答案:

答案 0 :(得分: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