쉘 스크립트(bash)에서 필요한 수의 변수를 생성하는 방법은 무엇입니까?

쉘 스크립트(bash)에서 필요한 수의 변수를 생성하는 방법은 무엇입니까?

Upstart를 사용하여 일부 사용자 프로세스를 모니터링하는 스크립트를 만들고 있는데, 제가 일하는 회사를 위한 것이므로 보편적으로 사용해야 합니다... 어때요? 모니터링되는 프로세스의 수는 번호와 이름처럼 다양할 수 있으므로 사용자가 프로세스 수 'n'개를 입력하고 셸에 경로 이름을 제공하여 변수에 저장하고 전달할 수 있도록 생성해야 합니다. 이를 포함하는 스크립트를 시작하면 내 질문은 다음과 같습니다. 필요한만큼 많은 변수를 어떻게 만들 수 있습니까?

이것은 지금까지 내 스크립트입니다 ...

./script input

#!/bin/bash

FILENAME=$1
i=1

while read LINE
do
[rutaServ$i]=$LINE
echo "ruta -> [rutaServ$i]"
i=`expr $i + 1`
done < $FILENAME

보시다시피, /home/user행만 포함된 일반 텍스트 파일에서 일시적으로 경로 이름을 가져오지만 이 스크립트를 실행하면 다음 오류가 발생합니다.[rutaServ1]=/home/user: The file or directory doesn't exists

이를 수행하는 올바른 방법은 무엇입니까?

답변1

배열 구문에 문제가 있는 것 같습니다. 또한 인덱스 변수가 필요하지 않습니다. +=연산자를 사용하여 배열에 추가할 수 있습니다.

#!/bin/bash

FILENAME=$1

rutaServ=()
while read LINE
do
rutaserv+=($LINE)
echo "ruta -> $LINE"
done < "$FILENAME"

bashv4 에는 파일 내용을 한 번에 배열로 읽을 수 있는 새로운 명령 mapfile(또는 )이 있습니다.readarray

mapfile rutaServ < "$FILENAME"

배열의 값에 액세스하려면:

for x in "${rutaserv[@]}"; do
    echo "$x"
done

답변2

스크립트를 이렇게 호출할 수 있나요 script.sh process1 process2? 그런 다음 다음과 같은 방법으로 매개변수를 참조할 수 있습니다 $@.

# set process1 process2 # set arguments for testing

for x in "$@"; do 
    echo "ruta -> $x"
done

[rutaServ$i]=$LINErutaServ[$i]=$LINE또는 이어야 합니다 rutaServ+=("$LINE").

관련 정보