쉘 스크립트에서 배열의 값을 인쇄합니다.

쉘 스크립트에서 배열의 값을 인쇄합니다.

두 개의 서로 다른 프로세스에 의해 시작된 프로세스가 있습니다(하나는 다음에 의해 시작됨).내부에그리고 다른 사람들은창사컨테이너)

명령을 통해 프로세스 이름을 사용하여 프로세스의 pid를 얻으려고 시도했지만 $(pidof $PROCESS_NAME)정상적으로 작동했습니다. 명령은 2개의 pid 값을 제공하지만 를 사용하여 개별 값을 인쇄하려고 하면 a=(${process_pids[0]})b=(${process_pids[1]})번째 명령만 첫 번째 값을 생성하고 두 번째 명령은 빈 값을 인쇄합니다.

배열에 두 개의 요소가 있더라도 길이도 1로 표시됩니다.process_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

배열을 사용하려면 , 또는 와 같은 배열을 지원하는 셸을 사용 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

관련 정보