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"
bash
v4 에는 파일 내용을 한 번에 배열로 읽을 수 있는 새로운 명령 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]=$LINE
rutaServ[$i]=$LINE
또는 이어야 합니다 rutaServ+=("$LINE")
.