我有一个进程由两个不同的进程启动(一个是由在里面以及其他由长沙容器)
我试图通过命令使用进程名称获取进程的pid $(pidof $PROCESS_NAME)
,效果很好。该命令给出了 2 个 pid 值,但是当我尝试使用打印各个值时a=(${process_pids[0]})
,b=(${process_pids[1]})
只有第一个命令产生第一个值,第二个命令打印为空。
尽管数组中有两个元素,但长度也显示为 1process_pids
另一方面,如果我们启用numbers_normal=(1234 5678)
而不是process_pids=$(pidof $PROCESS_NAME)
,尽管echo "pids = $numbers_normal"
只打印一个值,索引工作正常。
该声明有什么问题process_pids=$(pidof $PROCESS_NAME)
以及如何更正。
#!/bin/sh
PROCESS_NAME=process1
process_pids=$(pidof $PROCESS_NAME)
#numbers_normal=(1234 5678)
echo "pids = $process_pids"
a=( ${process_pids[0]} )
b=( ${process_pids[1]} )
echo "0th = $a"
echo "1st = $b"
# lengths are showing as 1, but the number of items are 2
echo "length = ${#process_pids[*]}"
echo "L = ${#process_pids[@]}"
for i in ${process_pids[@]}; do
echo "pid $i parent is $(ps -o ppid= -p $i)"
done
答案1
如果您要使用数组,请使用支持数组的 shell,例如zsh
、bash
或。该语言没有数组(尽管有些实现确实实现了ksh
yash
sh
sh
一些数组支持作为多种方式的扩展)。所以在这里,she-bang 应该是#! /bin/bash -
,而不是#!/bin/sh
。
然后,您需要初始化process_pids
为数组:
process_pids=($(pidof -- "$PROCESS_NAME"))
请注意过程替换周围的额外括号。您当前的分配设置process_pids
为标量。
$(...)
通过在声明中保留不带引号的内容array=(...)
,我们将调用 split+glob 运算符(仅使用 分割zsh
),并假设$IFS
尚未修改,则 的输出将在用于在输出中分隔 pid的pidof
换行符或空格字符上分割pidof
。
有了这个,你的循环将正确工作,并带有引号(如预期的那样[@]
):
for i in "${process_pids[@]}"; do