在 shell 脚本中打印数组中的数值

在 shell 脚本中打印数组中的数值

我有一个进程由两个不同的进程启动(一个是由在里面以及其他由长沙容器)

我试图通过命令使用进程名称获取进程的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,例如zshbash或。该语言没有数组(尽管有些实现确实实现了kshyashshsh一些数组支持作为多种方式的扩展)。所以在这里,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

相关内容