bash + 인스턴스 번호를 사용하여 배열 변수를 정의하는 방법

bash + 인스턴스 번호를 사용하여 배열 변수를 정의하는 방법

machine1이라는 변수를 machine$counter(counter=1인 동안)로 정의할 수 있습니까?

예를 들어 다음 파일을 만들고 /tmp/config.txtmachine1을 배열로 설정했습니다.

 $ more /tmp/config.txt
 machine1=( linux_server critical 1.1.1.1 )
 machine2=( linux_server critical 1.1.1.2 )
 .
 .

그런 다음 다음과 같은 간단한 스크립트를 작성하여 /tmp/config.txt다음과 같이 기계 배열을 인쇄해 보았습니다.

 $ more read.config.bash
 #!/bin/bash

 source /tmp/config.txt
 counter=1
 echo ${machine$counter[0]}
 echo ${machine$counter[1]}
 echo ${machine$counter[2]}
 .
 .

그러나 스크립트를 실행하면 다음과 같은 결과가 나타납니다.

$ ./read.config.bash
./read.config.bash: line 6: ${machine$counter[0]}: bad substitution
./read.config.bash: line 7: ${machine$counter[1]}: bad substitution
./read.config.bash: line 8: ${machine$counter[2]}: bad substitution

이 문제에 대한 해결책은 무엇입니까?

답변1

eval명령을 사용하십시오 .

eval "echo \${machine${counter[0]}}"

첫 번째 항목은 이스케이프 처리되므로 $문자열이 처리되기 전에 평가되지 않습니다.eval

작동 방식은 eval마치 명령 프롬프트에 명령을 입력하는 것처럼 명령을 실행하는 것입니다. 차이점은 실행되는 명령을 프로그래밍 방식으로 구성할 수 있다는 것입니다.

따라서 귀하의 시나리오 eval에서 명령을 실행할 때 명령은 다음과 같습니다.실제로실행은 다음과 같습니다. echo ${machineBLAH}.내부 변수 대체가 쉘에서만 수행되었습니다.앞으로 eval달리다.

자세한 내용은 다음 문서를 참조하세요.Bash의 "eval" 명령은 무엇입니까?.

답변2

사용을 피할 수 있습니다eval

source /tmp/config.txt
counter=1
line0="machine$counter[0]"
echo ${!line}

echo루프를 통해 호출하는 것이 더 좋습니다

for counter in 1 2 3
do
    line="machine$counter[@]"
    for element in "${!line}"
    do
        echo $element
    done
done

관련 정보