シェルスクリプトから配列の値を印刷します。

シェルスクリプトから配列の値を印刷します。

2つの異なるプロセスによって開始されたプロセスがあります(1つは次のものから始まります)。内部にそして他の人は長沙コンテナ)

コマンドでプロセス名を使用してプロセスのpidを取得しようとしましたが、$(pidof $PROCESS_NAME)正常に動作しました。コマンドは2つのpid値を提供しますが、を使用して個々の値を印刷しようとすると、最初のコマンドだけが最初の値を生成し、2番目のa=(${process_pids[0]})コマンドb=(${process_pids[1]})は空の値を印刷します。

配列に2つの要素がある場合でも、長さも1で表されます。process_pids

一方、代わりに有効にすると、numbers_normal=(1234 5678)1つの値のみが印刷され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

配列を使用するには、またはなどの配列をサポートするシェルを使用zshしますbash。言語には配列がありません(一部の実装では実装されていますが)。kshyashshsh一部アレイサポートはさまざまな方法で拡張されています。だからここでshe-bangはではなくて#! /bin/bash -はなりません#!/bin/sh

process_pidsその後、配列に初期化する必要があります。

process_pids=($(pidof -- "$PROCESS_NAME"))

手続き型置換の周りに追加の括弧があることに注意してください。現在の割り当てはprocess_pidsスカラーに設定されています。

$(...)宣言で引用符で囲まれていない項目を残すと、分割+glob演算子(分割のみを使用)をarray=(...)呼び出し、これが変更されていないと仮定し、出力は出力からpidを区切るために使用される改行または空白文字に分割されます。zsh$IFSpidofpidof

[@]これを使用すると、ループは引用符(予想どおり)で正しく機能します。

for i in "${process_pids[@]}"; do

関連情報