linux - ksh 中的数组长度总是返回 1 以及为什么数组不是行

标签 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

一行

我想创建一个包含线条的数组,而不是单词。

最佳答案

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

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

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

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

ps -elf | while read -a fields; do
    if [[ ${fields[2]} = $userid ]]; then
      continue
    fi
    echo "${fields[@]}"
done

关于linux - ksh 中的数组长度总是返回 1 以及为什么数组不是行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15485096/

相关文章:

c++ - 避免在 Linux 下的共享对象 C 接口(interface)上进行名称重整

linux - 在文件中查找部分重复行并计算每行重复了多少次?

bash - 等于和不等于运算符在 bash 脚本中不起作用

bash - 如何在脚本中将日期从 Unix 时间转换为字符串?

regex - 通过 shell 脚本复制目录结构

c - 使用 "tee"会使标准输出变慢

linux - 带有 epoll 的 TCP 服务器的线程和缩放模型

bash - 如何在 busybox shell 脚本中以非阻塞模式刷新命名管道(FIFO)?

php - 将变量从 PHP 导出到 shell

Python终端输出宽度